接口因为编码不一致导致出错:
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Invalid UTF-8 middle byte 0x3f; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid UTF-8 middle byte 0x3f
at [Source: (PushbackInputStream); line: 1, column: 27] (through reference chain:
...
org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:283)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:241)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:205)
表现:
1.本地测试接口正常,发布项目正常启动,日志打印正常
2.通过测试环境调用接口报错:JSON parse error: Invalid UTF-8 middle byte 0x3f
定位问题:
本地测试正常,说明本地环境编码一致,其他接口正常调用,说明不是json解析配置的问题
因此可以基本判断是代码与服务器的编码不同所致,为了验证并解决问题,做如下判断性测试
解决方案:
1.请求的mapping上添加
@PostMapping(value = "XXX",produces = "application/json;charset=UTF-8")
现象:本地正常,测试环境异常,仍旧报错
结论:不是本地环境编码原因,如果是,所有传入汉字的接口都会异常。
2.pom中maven打包添加如下配置
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
</plugin>
同时:启动bat文件中添加 java -Dfile.encoding=UTF-8 -jar -Xms2048m -Xmx2048m XXXX.jar --spring.profiles.active=test
现象:本地正常,测试环境正常,但是控制台输出日志为乱码
结论:可以得出配置生效,环境统一,但是控制台日志为乱码,确定是测试环境编码的问题
3.保持2的配置不变,查询实时打印日志窗口编码格式

logback日志控制台打印日志编码格式换为GBK
现象:本地正常接口访问,但是本地控制台打印乱码(本地环境编码格式为UTF-8),测试环境正常,控制台输出日志正常
总结:
最后判断,本地使用UTF-8编码格式,而发布环境是GBK编码格式,这样发送的请求会由于编码格式的问题产生乱码,导致mybatis-plus不能识别条件中的汉字而出错。
由于遗留问题,只能做这么多了,在本地测试的时候把控制台的编码格式换成UTF-8即可,发布到测试或者生产环境,已经做了标记,按需改变对应地方的编码格式即可,虽然可能麻烦点,却是成本最小的解决办法 |