编码格式问题 错误:JSON parse error: Invalid UTF-8 middle byte 0x3f

接口因为编码不一致导致出错:

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打包添加如下配置

-Dfile.encoding=UTF-8


       org.springframework.boot
       spring-boot-maven-plugin
       
             true
             -Dfile.encoding=UTF-8
       

同时:启动bat文件中添加 java  -Dfile.encoding=UTF-8 -jar  -Xms2048m -Xmx2048m XXXX.jar --spring.profiles.active=test

现象:本地正常,测试环境正常,但是控制台输出日志为乱码

结论:可以得出配置生效,环境统一,但是控制台日志为乱码,确定是测试环境编码的问题

3.保持2的配置不变,查询实时打印日志窗口编码格式

编码格式问题 错误:JSON parse error: Invalid UTF-8 middle byte 0x3f_第1张图片

logback日志控制台打印日志编码格式换为GBK

现象:本地正常接口访问,但是本地控制台打印乱码(本地环境编码格式为UTF-8),测试环境正常,控制台输出日志正常

总结:

最后判断,本地使用UTF-8编码格式,而发布环境是GBK编码格式,这样发送的请求会由于编码格式的问题产生乱码,导致mybatis-plus不能识别条件中的汉字而出错。

由于遗留问题,只能做这么多了,在本地测试的时候把控制台的编码格式换成UTF-8即可,发布到测试或者生产环境,已经做了标记,按需改变对应地方的编码格式即可,虽然可能麻烦点,却是成本最小的解决办法

你可能感兴趣的:(日常问题,乱码,java,spring,后端)