在java项目里面,我使用@RestControllerAdvice 并实现 ResponseBodyAdvice接口, 统一返回了JSON数据,当把数据放到一个对象Massage里面去时, 会导致接口文档出现 文档请求异常
解决了吗,我遇到了没解决
@RestControllerAdvice
public class CommonResponseAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Class> aClass) {
if(methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponse.class))
return false;
if(methodParameter.getMethod().isAnnotationPresent(IgnoreResponse.class))
return false;
if("ApiResourceController".equals(methodParameter.getDeclaringClass().getSimpleName())){
return false;
}
if(methodParameter.getDeclaringClass().isAnnotationPresent(ApiIgnore.class))
return false;
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if(o instanceof CommonResponse){
return o;
}else{
CommonResponse<Object> response = CommonResponse.builder().build();
Optional.ofNullable(o).ifPresent(response::setData);
return response;
}
}
}
这个可行,谢谢
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
包装了结构是没办法的,你需要放开Swagger的接口,不能对齐进行统一封装
自定义包装会有N个不同(N个不同的开发)的结构,那组件没法统一了
参考这里面的结构:https://xiaoym.gitee.io/knife4j/faq/knife4j-exception.html
同样遇到这个问题了,网关层聚合的文档,封装全局统一响应后,knife4j文档展示不出来
请问后面有好的方法解决这个问题嘛
可以解决
// 调试一下看看methodParameter对应的swagger是什么类型,然后添加在数组中
private static final String[] EXCLUDE = {
"Swagger2Controller",
"Swagger2ControllerWebMvc",
"ApiResourceController"
};
@Override
public Object beforeBodyWrite(
final Object obj, final MethodParameter methodParameter, final MediaType mediaType,
final Class<? extends HttpMessageConverter<?>> aClass,
final ServerHttpRequest serverHttpRequest, final ServerHttpResponse serverHttpResponse) {
if (obj instanceof ApiResult) {
return obj;
}
// 避免swagger失效
if (Arrays.asList(EXCLUDE).contains(methodParameter.getDeclaringClass().getSimpleName())) {
return obj;
}
return ApiResult.ok(obj);
}
修改以后不能显示接口的信息,有解决方法么
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
private static final String[] EXCLUDE = {
"ApiResourceController"
};
@Autowired
private ObjectMapper objectMapper;
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@SneakyThrows
@Override
public Object beforeBodyWrite( final Object o, final MethodParameter methodParameter, final MediaType mediaType,
final Class<? extends HttpMessageConverter<?>> aClass,
final ServerHttpRequest serverHttpRequest, final ServerHttpResponse serverHttpResponse) {
if(o instanceof String){
return objectMapper.writeValueAsString(ResultData.success(o));
}
if(o instanceof ResultData){
return o;
}
if (Arrays.asList(EXCLUDE).contains(methodParameter.getDeclaringClass().getSimpleName())) {
return o;
}
return ResultData.success(o);
}
}
// 调试一下看看methodParameter对应的swagger是什么类型,然后添加在数组中
private static final String[] EXCLUDE = {
"Swagger2Controller",
"Swagger2ControllerWebMvc",
"ApiResourceController"
};
用了Knife4j4.0版本,也是这个问题,多加两个放行的
private static final String[] EXCLUDE = {
"Swagger2Controller",
"Swagger2ControllerWebMvc",
"ApiResourceController",
"SwaggerConfigResource",
"OpenApiWebMvcResource"
};
登录 后才可以发表评论