spring boot定义全局返回值导致swagger无法访问

在SpringBoot中,全局返回值处理器可能导致Swagger无法访问,因为响应体被缓存。为了解决这个问题,可以实现ResponseBodyAdvice接口,并在方法中判断请求是否与Swagger相关,如果是则跳过缓存操作。示例代码展示了如何在处理器中检查请求路径,避免对Swagger请求的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Spring Boot 中,如果定义了全局返回值处理器(例如使用 @ControllerAdvice 和 @RestControllerAdvice 注解),可能会导致 Swagger 无法访问。这是由于 Spring Boot 在使用全局返回值处理器时,会将请求的响应体(response body)缓存起来,导致 Swagger 的 API 文档无法正常生成。

为了解决这个问题,我们可以在全局返回值处理器中添加特定的判断条件,以避免对 Swagger 的影响。具体来说,可以在处理返回值的方法中,判断当前请求是否是 Swagger 相关的请求,如果是,则不进行缓存操作。示例代码如下:

@RestControllerAdvice
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {

    /**
     * 判断是否需要处理返回值
     */
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        // 判断当前请求是否是 Swagger 相关的请求
        return !returnType.getDeclaringClass().isAssignableFrom(BasicErrorController.class);
    }

    /**
     * 处理返回值
     */
    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {
        // 判断当前请求是否是 Swagger 相关的请求
        if (request.getURI().getPath().startsWith("/swagger") || request.getURI().getPath().startsWith("/v2/api-docs")) {
            return body;
        }
        
        // 其他情况下进行缓存操作
        // ...
    }
}

在这个例子中,我们通过实现 ResponseBodyAdvice 接口来进行全局返回值处理。在 supports() 方法中,我们判断当前请求是否是 Swagger 相关的请求,如果是则返回 false,否则返回 true;在 beforeBodyWrite() 方法中,我们同样通过判断请求的 URI Path 是否以 “/swagger” 或 “/v2/api-docs” 开头的方式,来判断当前请求是否是 Swagger 相关的请求。如果是,则直接返回原始的响应体;否则,继续进行其他操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值