一次@RestControllerAdvice统一处理请求响应造成Knife4J无法打开的BUG

本文探讨了如何解决Spring Boot应用中集成Knife4j时遇到的加载错误,包括文档再封装问题、拦截器对静态资源的影响,以及Swagger配置调整。通过排除特定控制器和重构响应处理,作者提供了详细的修复步骤和最佳实践。
摘要由CSDN通过智能技术生成
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

当我们打开文档时显示knife4j加载错误
打开控制台发现
在这里插入图片描述
文档被进行了再封装,导致加载出现了错误
我们在统一处理的地方打上断点
在这里插入图片描述
用它的类型或者其他特征为依据对他取消包装即可;
尽量放在常规封装之后,减少无效的调用,。因为业务代码通常直接就在上面返回了;

private static final String[] exclude={
        "Swagger2Controller",
        "ApiResourceController"
};
// 避免swagger失效
if(Arrays.asList(exclude).contains(methodParameter.getDeclaringClass().getSimpleName())){
    return o;
}

顺便解决一波因为拦截器导致favicon.ico加载失败,同时一直走进拦截器刷日志很烦人的问题,。
之前配置为

registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/pzh-api/favicon.ico").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");

是错的,修改为

//配置拦截器访问静态资源
//registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/static/");
registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/static/");
//registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/static/");

修改完成以后发现doc.html找不到页面,解决:
不要给Swagger的doc和js配置,否则会找不到地址,不配置它使用默认的就好了,
之前由于配置的地址错误,直接就报错跳转/error然后被拦截器拦截这个路径,直接报了无token的错误;然后走了默认路径;

统一封装响应

public class HttpResult {
    private boolean flag;
    private Integer code;
    private String message;
    private Object data;

    public HttpResult(boolean flag, Integer code, String message) {
        this.flag = flag;
        this.code = code;
        this.message = message;
    }
    private static<T> HttpResult success(T data){
        return new HttpResult(true,2000,"成功",data);
    }
    
    private static<T> HttpResult success(){
        return new HttpResult(true,2000,"成功");
    }

    private static<T> HttpResult fail(){
        return new HttpResult(false,5000,"失败了");
    }
}
当在Spring Boot项目中使用Knife4J作为API文档生成工具,并且某个处理请求的方法没有添加`@RequestBody`注解接收HTTP请求体数据,这可能导致在Knife4J的调试界面中不会直接显示一个用于输入Form Data格式参数的表单。 `@RequestBody`通常用于标注从请求主体接收JSON或表单数据的方法参数,如果没有这个注解,那么默认情况下,Knife4J可能会假设该参数是从URL路径、查询参数或头部信息获取的,而不是从请求主体获取的。因此,它不会在调试界面上提供预览表单字段的区域。 如果你想让 Knife4J 显示来自表单数据的参数,可以尝试以下几个步骤: 1. **显式标记参数**:如果确实需要解析请求体,可以在参数上使用`@ModelAttribute`或`@RequestParam`(如果是HTTP GET请求)注解,告诉框架这是一个期望从请求体接收的数据。 ```java @PostMapping("/your-endpoint") public ResponseEntity<?> processRequest(@ModelAttribute YourData yourData) { //... } ``` 2. **自定义拦截器**:如果还是希望显示为表单,你可以创建一个自定义的Swagger2ControllerAdvice,配置knife4j的拦截器去识别并解析这种模式。 3. **查看文档设置**:确认 Knife4J 是否启用了对非`@RequestBody`参数的支持,可能需要在配置文件中启用相关的选项。 如果你遇到具体的问题,建议检查项目配置和刀具插件的文档,因为可能存在特定版本兼容性问题。如果问题依然存在,可以考虑更新到最新版的Knife4J,或者在相关论坛寻求帮助,给出详细的代码片段以便于诊断。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值