当前位置: 首页 > 知识库问答 >
问题:

springdoc多个404响应使用@ApiContent(java注释)

贝德辉
2023-03-14

如何使用java注释创建多个404响应(或者更广泛地说,多个相同的HTTP代码响应)。

我试过:

@ApiResponse(
    responseCode = "404",
    description = "Not Found 1"
)
@ApiResponse(
    responseCode = "404",
    description = "Not Found 2"
)

还有多个@Content

@ApiResponse(
    responseCode = "404",
    content = {
        @Content(schema = @Schema(name = "404-1", description = "404-1")),
        @Content(schema = @Schema(name = "404-2", description = "404-2"))
    }
)

我能得到类似于多重的东西的唯一方法是使用@ExampleObject[]

@ApiResponse(
    responseCode = "404",
    content = @Content(
        mediaType = "application/json",
        examples = {
            @ExampleObject(name = "404-1", description = "Not Found 1 desc"),
            @ExampleObject(name = "404-2", description = "Not Found 2 desc")
        }
    )
)

这并不理想,因为它需要人与人之间的互动来查看所有这些内容,而这只是不需要的;我们的期望是:

- 200
- 404 Description 1
- 404 Description 2
- 404 Description 3

或者更好:

- 200
- 404 Description 1
      Description 2
      Description 3

我正在使用springdoc和以下dep:

<dependency>
  <groupId>org.springdoc</groupId>
  <artifactId>springdoc-openapi-ui</artifactId>
  <version>1.4.3</version>
</dependency>

共有2个答案

韶浩皛
2023-03-14

我通过添加超文本标记语言解决了我的问题

@Operation(
   responses = {
      @ApiResponse(responseCode = "404", content = @Content,
         description = 
            "This is potential 404 #1 <br/>" +
            "This is potential 404 #2"
      )
   }
)

或者,

您可以创建注释以使其更具可读性,例如类似于@ApiResponse404的内容,并通过OperationCustomizer将其添加到操作中:

@Override
public Operation customize(Operation operation, HandlerMethod handlerMethod) {
    ApiResponse404 notFounds = handlerMethod.getMethodAnnotation(ApiResponse404.class);
    if (notFounds != null)
        operation.getResponses()
                 .addApiResponse("404", new ApiResponse()
                                            .description(String.join("<br/>", notFounds.value()))
                                );
    return operation;
}

当然,您必须考虑@内容,您可以轻松地将其添加到注释中,但我不需要它,我的场景,我只需要描述。

然后在控制器中,您可以使用注释:

@GetMapping("/helloworld")
@ApiResponse404({"This is potential 404 #1", "This is potential 404 #2"})
String getHelloWorld() {
    return "Hello. World.";
}
欧阳何平
2023-03-14

根据设计,而不是springdoc,而是OpenAPI-规范,所有响应都存储在扩展LinkedHashMap的Api响应类型中。

  • https://github.com/OAI/OpenAPI-Specification/blob/3.0.1/versions/3.0.1.md#responsesObject

每个HTTP代码中,对于一个操作只能分配一个ApiContent对象。

使用例子是一个很好的方法。如果您的多个404响应具有不同的结构,您可以使用one of如下:

@RestController
public class HelloController {

@GetMapping("/hello")
@ApiResponses({
        @ApiResponse(responseCode = "200"),
        @ApiResponse(description = "Not found", responseCode = "404",
                content = @Content(mediaType = "application/json", schema = @Schema(oneOf = {
                        Foo.class, Bar.class }))) })
String hello() {
    return null;
}


@Schema(description = "this is bar")
class Bar {
    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

@Schema(description = "this is foo")
class Foo {

    private String foo;

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }

}
}
 类似资料:
  • 我有一个控制器endpoint,返回字符串列表。我有代码在我的转换层,取代了这个页面的字符串。(Page是我写过的一个类。)我如何告诉Spring医生来处理这个。默认情况下,springdoc将响应声明为字符串的JSON数组。 我可以让它替换我的回答中的字段列表,如下所示: 但我不想让它那样做。事实上,页面有一个列表字段,因此它会变成一个页面字段,而页面字段本身也有一个页面字段,依此类推。 使用s

  • 根据传入的参数,我有一个可以返回单个项目或项目列表的endpoint(目前endpoint没有灵活性,我无法更改代码)。 我试图生成API留档与OpenApi注释。 我的endpoint: 参数是可选的。如果只提供了参数,则返回已获得资格的人员列表,例如: {返回 为此,我的响应注释是: 但是,如果还提供了参数,则仅返回特定的资格记录持有人,例如: 返回: 对此,我的回答是: 我的问题是我不知道如

  • 我想在spring boot中,当响应对象对于每个响应自动为null时返回404。 我需要建议。 我不想检查控制器中的对象是否为null。

  • 本文向大家介绍symfony2 返回404响应,包括了symfony2 返回404响应的使用技巧和注意事项,需要的朋友参考一下 示例 当在服务器上找不到资源时,将返回404响应。在Symfony中,可以通过引发NotFoundHttpException异常来创建此状态。为了避免use在控制器内部添加多余的语句,请使用类createNotFoundException()提供的Controller  

  • 我们最近从springfox迁移到springdoc openapi 3。其中一个API返回大约2MB的数据,它在springfox中正常工作,但是springdoc openapi用户界面在几分钟内没有响应,渲染也需要2分钟以上。有什么办法可以解决吗?

  • 我正试图将示例响应值添加到我的springdoc-openapi swagger文档中。 比如用“马克吐温”代替“字符串”等。 我尝试使用这个解决方案-springdoc openapi:如何添加POST请求示例? 我已经在课堂上使用了。 如果我使用这个- @io.swagger.v3.oas.annotations.parameters.RequestBody(内容=@Content(示例={@