@ControllerAdvice 将所有可用的异常推送到响应描述,即使它无法抛出

问题描述 投票:0回答:1

我有一个简单的 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
来说这是正常的,但我无法找到一种方法来以某种方式调整它以仅包含正确的响应...

spring-boot swagger openapi
1个回答
0
投票

我也有同样的问题。我现在不知道你是否已经找到了解决方案,但它可以帮助其他人。我解决了这个问题,将 swagger (v3) 中的选项 @Hidden 放置在我的类中,并用 @ControllerAdvice 进行注释。所有注释的内容(方法或类)对所有 Swagger 端点都是隐藏的。使用此选项,您必须在使用 @RestController 注释的类/方法中标记要在 Swagger 页面中映射的所有内容。

import io.swagger.v3.oas.annotations.Hidden;

@Hidden
© www.soinside.com 2019 - 2024. All rights reserved.