Knife4j文档请求异常(基于SpringBoot3,查找原因并解决)

博主采用的是SpringBoot3+knife4j的框架,如果你采用的是SpringBoot2框架,那么可以看下面这几篇:

Knife4j文档请求异常 | Knife4j

记一次集成swagger2(Knife4j)在线文档异常,提示:Knude4j文档请求异常_knife4j文档请求异常-CSDN博客全网多种方式解决Knife4j文档请求异常-CSDN博客


博主最近做苍穹外卖时碰到了一个问题,Knife4j文档请求异常,如下图所示:

于是F12打开控制台准备进行debug,发现报出如下错误:

大致意思是JSON返回了一个token,继续从网络的响应查找:

发现响应码(200)正常,并且返回格式为json,查看响应内容:

居然是一长串字符串,而不是Json数据。于是到了最令人烦躁的debug环节,从编辑器控制台查看没有任何ERROR甚至WARN信息:

复制代码
2024-01-09T15:17:43.508+08:00  INFO 22868 --- [           main] com.sky.SkyApplication                   : Starting SkyApplication using Java 17.0.8 with PID 22868 (E:Codesky_take_out_projsky_take_outsky_server	argetclasses started by User in E:Codesky_take_out_projsky_take_out)
2024-01-09T15:17:43.510+08:00  INFO 22868 --- [           main] com.sky.SkyApplication                   : The following 1 profile is active: "dev"
2024-01-09T15:17:44.228+08:00  INFO 22868 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
2024-01-09T15:17:44.230+08:00  INFO 22868 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2024-01-09T15:17:44.265+08:00  INFO 22868 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 23 ms. Found 0 Redis repository interfaces.
2024-01-09T15:17:44.830+08:00  INFO 22868 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2024-01-09T15:17:44.837+08:00  INFO 22868 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-01-09T15:17:44.837+08:00  INFO 22868 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.16]
2024-01-09T15:17:44.920+08:00  INFO 22868 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-01-09T15:17:44.920+08:00  INFO 22868 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1369 ms
Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts
2024-01-09T15:17:45.242+08:00  INFO 22868 --- [           main] com.sky.config.WebMvcConfiguration       : 开始注册自定义拦截器...
2024-01-09T15:17:45.908+08:00  INFO 22868 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2024-01-09T15:17:45.917+08:00  INFO 22868 --- [           main] com.sky.SkyApplication                   : Started SkyApplication in 3.027 seconds (process running for 3.722)
2024-01-09T15:17:45.919+08:00  INFO 22868 --- [           main] com.sky.SkyApplication                   : server started
2024-01-09T15:19:13.412+08:00  INFO 22868 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-01-09T15:19:13.413+08:00  INFO 22868 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-01-09T15:19:13.414+08:00  INFO 22868 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2024-01-09T15:19:14.040+08:00  INFO 22868 --- [nio-8080-exec-6] o.springdoc.api.AbstractOpenApiResource  : Init duration for springdoc-openapi is: 261 ms

突然想起来之前设置过一个消息转换器,将Date类型转换为yyyy-MM-dd HH:mm格式去显示,于是考虑是否因为消息转换器,将JSON数据不正常解析了?

复制代码
    /**
     * 扩展消息转换器,将日期类型从列表转换为时间戳
     * @param converters 消息转换器列表
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        jackson2HttpMessageConverter.setObjectMapper(new JacksonObjectMapper());

        converters.add(0,jackson2HttpMessageConverter);
    }

于是将消息转换器注释掉,便正常显示了:

返回的JSON数据也正常了,代价是后端返回的时间数据不是上面提到的格式,而是列表,导致前端显示错误的格式:

至此


如果你还想保留消息转换器,让后端返回正确的时间数据格式,那么可以调整消息转换器列表中转换器的顺序,代码如下。

复制代码
    /**
     * 扩展消息转换器,将日期类型从列表转换为时间戳
     * 这个是导致knife4j不能正常显示的罪魁祸首,特别要注意添加的位置
     * @param converters 消息转换器列表
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        jackson2HttpMessageConverter.setObjectMapper(new JacksonObjectMapper());
        converters.add(converters.size()-1,jackson2HttpMessageConverter);
    }

一些参考文章:

MappingJackson2HttpMessageConverter使用及jackson配置原理和避坑说明-CSDN博客

一步到位 SpringBoot 序列化与消息转换器 (你需要的这里都有)_springboot 序列化 自定义转换器-CSDN博客

为什么说HttpMessageConverter的顺序非常重要_SpringBoot?

相关推荐
Rabitebla8 小时前
【Linux】 权限篇(三):深入理解 umask 位运算与粘滞位的设计思想
java·linux·服务器·c++·笔记·学习
zoyation8 小时前
HBase 2.5.16 单机部署
大数据·数据库·hbase
l1t8 小时前
DeepSeek总结的 PostgreSQL 中的二进制只读副本,第一部分
数据库·postgresql
Tech探索者8 小时前
重装飞牛 NAS,几 KB 的 .bin 够吗?我的备份与恢复全过程
运维·服务器
java_prinln8 小时前
9. Agent 的长短期记忆系统怎么做的?记忆是怎么存的?粒度是多少?怎么用的?
数据库·python·agent
讯捷蓝达8 小时前
机房突发断电,5 盘 RAID硬盘全部掉线: 急速上门救援,现场4小时华为2288H V5服务器数据完整恢复
运维·服务器·数据库
Pniubi8 小时前
介绍一下我的agent项目中记忆、RAG系统的相关数据库
数据库
Pin_Qing8 小时前
缓存能活多久,现在是个要算的参数
java·大数据·开发语言·人工智能·程序人生
ly76898 小时前
性能剖析与压测方法论:JMH、async-profiler 与分层瓶颈定位的可复现实验
服务器·前端·数据库·压测·jmh·性能剖析·async-profiler
longerxin20208 小时前
Ubuntu 22.04 ARM64 云镜像开启 root 密钥登录(保留 ubuntu 密钥登录,禁止密码登录)
数据库·ubuntu·postgresql