789 Star 6.9K Fork 1.4K

GVP萧明/knife4j

@RestControllerAdvice 统一返回JSON导致 Knife4j文档请求异常

已完成
创建于  
2021-10-12 09:23

在java项目里面,我使用@RestControllerAdvice 并实现 ResponseBodyAdvice接口, 统一返回了JSON数据,当把数据放到一个对象Massage里面去时, 会导致接口文档出现 文档请求异常

输入图片说明
输入图片说明

评论 (11)

jimizy 创建了任务 4年前
jimizy 关联仓库设置为萧明/knife4j 4年前
展开全部操作日志

解决了吗,我遇到了没解决

@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;
    }
}

}

这个可行,谢谢

118100 xiaoym 1578918321 萧明 拥有者 4年前

包装了结构是没办法的,你需要放开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"
};

也可以这样
@RestControllerAdvice(basePackages = "com.zzz.xxx")
只扫描自己的包

萧明 添加了
 
wontfix
标签
3年前
萧明 里程碑设置为Knife4j 4.0版本 3年前
萧明 任务状态待办的 修改为已完成 3年前

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(10)
张海利-zhanghaili111 暮沐星尘-mmxc 118100 xiaoym 1578918321 geekerstar-geekerstar lewjun072-lewjun072 卤蛋-marinated-eggg 10061682 yoofff 1703510035 950637 dyt314569024 1638492375 9417724 clover996 1649594690 5104564 jimizy 1587974220
Java
1
https://gitee.com/xiaoym/knife4j.git
git@gitee.com:xiaoym/knife4j.git
xiaoym
knife4j
knife4j

搜索帮助