在 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 相关的请求。如果是,则直接返回原始的响应体;否则,继续进行其他操作。