我有一个简单的 Spring Boot 应用程序,其中包含多个
@RestController
和一个作为 @ControllerAdvice
的全局异常处理程序,它使用自定义代码和错误 dto 处理一些自定义异常。另外,我正在用 swagger 生成 api 文档,并且有一个奇怪的行为:
每个方法响应描述都包含
@ControllerAdvice
中描述的所有错误,不取决于方法是否可以抛出此自定义异常:)
例如,我有两个休息控制器:
@RestController
@RequestMapping("/foo")
class FooController(private val fooService: FooService) {
fun makeFoo() {
fooService.makeFoo()
}
}
@RestController
@RequestMapping("/bar")
class BarController {
fun makeBar(private val barService: BarService) {
barService.makeBar()
}
}
FooService 可以抛出 FooException,BarController 可以抛出 BarException。
我正在通过全局异常处理程序处理这些错误:
@RestControllerAdvice
class GlobalExceptionHandler {
@ExceptionHandler(FooException::class)
@ResponseStatus(HttpStatus.CONFLICT)
fun indexAlreadyExists(exception: FooException) {
}
@ExceptionHandler(BarException::class)
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
fun indexAlreadyExists(exception: BarException) {
}
}
因此,swagger
FooController
响应应包含 409,而 BarController
响应应包含 422。但它们都包含 409 和 422 响应。
如何手动设置或配置?我需要每个方法的响应是分开的,因为当前的业务逻辑是......
*附注似乎对于全局
@RestControllerAdvice
来说这是正常的,但我无法找到一种方法来以某种方式调整它以仅包含正确的响应...
我也有同样的问题。我现在不知道你是否已经找到了解决方案,但它可以帮助其他人。我解决了这个问题,将 swagger (v3) 中的选项 @Hidden 放置在我的类中,并用 @ControllerAdvice 进行注释。所有注释的内容(方法或类)对所有 Swagger 端点都是隐藏的。使用此选项,您必须在使用 @RestController 注释的类/方法中标记要在 Swagger 页面中映射的所有内容。
import io.swagger.v3.oas.annotations.Hidden;
@Hidden