
背景
接手了一个项目,在原基础上继续开发,好多东西不方便动。
环境:jdk17、maven3.9.6、spring.cloud2023.0.2、spring-boot3.3.0、springdoc-openapi2.x、…
先是用的这个
spring-boot3.3.0 + springdoc-openapi2.3.0
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
后面又改成这个
spring-boot3.3.0 + knife4j4.5.0
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.5.0</version>
</dependency>
问题原因
我出现的原因
新版本的返回值改成了byte[],之前是String类型的,然后返回给前端时把byte[]序列化成了一个base64的字符串,导致前端无法处理。
前端请求得到的响应结果:
base64字符串解码后的结果如下:
网上搜集到的原因
1. controller里面的方法名有重复的:然后我在代码里面搜了一下,还真有不少重复的,但是我把重复的名字改了后还是不行。
2. controller里面有私有方法:我的代码里面没有,我未验证。
3. openapi的请求路径被拦截:放行对应路径即可,我的代码里面没有,我未验证。
4. 其他...
解决方法
方法1. 单独处理返回值
在数据返回前将数据处理一下,把byte[] 转化为String类型;但是在我的系统里面String直接返回给前端时,序列化会加上转义字符,如下面这样
导致前端还是无法处理,所以我这里把字符串再次转换成了一个JsonObject对象直接返回给前端。
整个处理就只加了下面这个类。
这是修改后正常返回的数据:
方法2. 修改序列化器
问题出现的原因是因为序列化时把byte[]序列化成了base64的字符串,可以直接修改序列化器,这个方式较简单,但因为我的系统里面不太方便做这个操作,所以没有采用这种方式。
注意用这种方式是否会对原业务响应产生影响。