我试图使用Swagger UI来创建和部署我的文档以及我用Spring Boot编写的API。我知道Swagger提供了一些注释来帮助在实际的控制器类中编写文档,但是我很难让它们做我需要的事情。
我的问题是我有一个通用的DTO类,每次调用我的API都会返回。此 DTO 具有用于通用对象的内容
字段。如果我直接使用这些对象,我知道我可以使用类似的东西
@ApiResponse(responseCode = "200", description = "Customer found",
content = @Content(
schema = @Schema(implementation = Customer.class)))
以便给出对象的JSON表示应该是什么样子的规范。但是,因为我将所有内容都包装在一个特定的< code>ResponseDTO类中,所以我需要一种方法来指定< code>contents字段应该是什么样子,并且我不确定可以使用哪些注释来完成这一点。我觉得绝对应该有类似
@ApiResponse(responseCode = "200", description = "Customer found",
content = @Content(
schema = @Schema(implementation = DTO.class,
fields = { "contents" = @Schema(implementation = Customer.class)})))
或类似的东西。我无法找到如何真正实现这一目标的解释。我的直觉表明,应该有一种方法可以将架构放入架构中,但也许还有另一种我没有考虑过的解决方案。任何帮助或方向将不胜感激。提前致谢。
看起来你在向后做这件事。为此,我使用http://swagger.io上的编辑器创建了一个指定API的. yaml文件
这样你的。yaml文件可以为每种数据类型指定不同的DTO,您可以为每个API指定它返回什么类型。
此外,您不会发布响应DTO类的外观。我希望你已经把它生成了:
public class ResponseDTO<T> {
public T getData() { … }
…
}
但我不确定这样拥有自己的对象是不是个好主意。在我过去的一些项目中,我们为每种数据类型定义了一个单独的响应类,但是它们都做同样的事情!你的框架可能已经为你写了这样一个类。
你正在使用Spring靴,这就是我使用的。对于Spring,该类是组织Spring框架
。(其他框架可能有自己的版本。而且它是通用的,因此您可以向其添加任何数据类型的内容。但 Swagger 要求您指定所添加内容的类型,而不是响应实体
类本身。您的响应DTO类正在妨碍您。
因此,如果要返回一种类型的自定义产品,则 swagger 生成的批注将指定 CustomProduct.class,并且您的服务方法将如下所示:
… (more annotations)
@ApiResponses(value = {
@ApiResponse(code=200, message="Found", response=CustomProduct.class)
})
public ResonseEntity<CustomProduct> getCustomProduct(…) {
CustomProduct myCustomProduct = retrieveCustomProduct(…);
return new ResponseEntity<>(myCustomProduct, HTTPStatus.OK);
}
我成功地用@Schema标记了类的字段,它工作得很好,但是我用它来给出map的信息。
class CreateReq extends DTO {
@Schema(description="",
implementation = Products.class)
Map<String,Map<String,Object>> products;
}
// For openapi document only
private static class Products {
ProductFields productId1;
ProductFields productId2;
}
// For openapi document only
private static class ProductFields {
String field1;
Object field2;
}
我知道这个帖子是旧的,但我还是要发这个帖子,以防有人有类似的问题。
我还必须返回一个对象列表,其中这些对象的一个字段必须根据某些请求参数进行更改。为了在 Swagger 中记录这些子模式(如您所说,模式内部的模式),您可以使用@Schema
注释的 oneOf
属性并提供泛型类的列表。
下面是一个示例:
< code>Customer.java:
java prettyprint-override">public class Customer {
// Some other fields...
@Schema(
description = "List of generic contents inside Customer",
oneOf = {Bar.class, Foo.class})
private List<IContent> contents;
}
< code>IContent.java只是一些接口(或者它可以是泛型类的任何超类):
public interface IContent extends Serializable { }
假设< code>Foo.java和< code>Bar.java是两个通用类:
public class Bar implements IContent {
@Schema(description = "Some dummy name field inside Bar")
private String dummyName;
@Schema(description = "Some dummy number field inside Bar")
private Integer dummyNo;
}
public class Foo implements IContent {
@Schema(description = "Some dummy ID field inside Foo")
private Long contentID;
}
如果您有不同于记录一个通用对象列表的需求,请参见其他子模式属性类型的allOf和anyOf属性。
我正在使用从以下依赖项导入的Swagger/OpenAPIV3注释创建应用程序的API描述: 其中一个批注是批注,它接受名为的属性,该属性允许字符串数组: 现在,我想使用在枚举类上构造的自定义方法,该方法返回允许的字符串数组,因此不需要在每次向枚举添加类型时添加该方法。以便我们可以这样使用它: 现在这是无法编译的,因为在执行注释时不知道该方法。是否有这样的解决方案允许在SwaggerV3注释属性值
假设我生成了一个具有多个属性的域对象。我想为defn类中的一个对象属性生成@jsonignore注释。
问题内容: 我正在尝试用其他常量定义常量,但似乎无法完成,因为当所需常量依赖于它时,初始常量尚未准备就绪。我想确定这是否完全不可能。 目前,我有这样的常量: 后两个常数是我想要完成的 问题答案: 定义控制器,服务和其他控制器之间的依赖关系的角度方法是通过依赖关系注入(DI)。因此,如果您有一个依赖于服务B的控制器A,则必须像这样创建它。 可以看到,angular将检查serviceB依赖关系,并查
所以我想要一个“Void Repository”,通过它可以访问不一定在实体上操作的存储过程。 但这当然不起作用,因为期望是一个实体。 有没有一种方法可以使用注释而无需创建虚拟实体,或者我是否坚持使用使用通过准备好的语句进行查询的已实现类? 因为老实说,这很难看:
我看了已经问过的问题,但没有一个能够解决我的问题。 < code > https://stack overflow . com/questions/45534187/path-and-formdata-parameter-at-same-time < code > https://stack overflow . com/questions/50562971/swagger-editor-show
我正在寻找一个解决方案来解决Swagger(OpenAPI)数据类型和JSON模式之间处理数据类型空值的不兼容性。 我们的swagger文件包含所有模式定义,我想使用JSON。Net模式,用于API测试中的模式验证步骤。 有效的swagger属性定义: 将失败JSON模式验证空值()。 如果我将可为空的属性定义替换为: 对于空值,验证将是成功的,但这打破了昂首阔步的语法。 我找不到的OpenAPI