前提条件
准备工程
account和consumer为两个应用服务,具体集成springdoc的方法可参考博文。(感觉写的还不错)
上图示例工程源码 代码仅供参考
问题描述
在应用服务中统一处理返回结果时,具体代码实现
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
@Resource
private ObjectMapper objectMapper;
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
if (o instanceof String) {
return objectMapper.writeValueAsString(RestResponse.success(o));
}
if (o instanceof RestResponse) {
return o;
}
return RestResponse.success(o);
}
}
报错截图
解决方法
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
@Resource
private ObjectMapper objectMapper;
/**
* 判断是否要执行 beforeBodyWrite 方法,true为执行,false不执行,有注解标记的时候处理返回值
* 这里整合swagger出现了问题,swagger相关的不拦截
*/
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return !methodParameter.getDeclaringClass().getName().contains("OpenApi");
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
if (o instanceof String) {
return objectMapper.writeValueAsString(RestResponse.success(o));
}
if (o instanceof RestResponse) {
return o;
}
return RestResponse.success(o);
}
}