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

博客内容描述了一起因编码不一致引发的接口调用错误,表现为JSON解析异常。问题定位从本地环境与服务器编码差异展开,通过在请求mapping中设置charset、修改maven打包配置和调整日志输出编码等尝试解决。最终确定为本地UTF-8与发布环境GBK编码不匹配导致。解决方案是在本地测试时将控制台编码更改为UTF-8,并在发布环境调整相应编码设置,以确保一致性。
摘要由CSDN通过智能技术生成

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

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即可,发布到测试或者生产环境,已经做了标记,按需改变对应地方的编码格式即可,虽然可能麻烦点,却是成本最小的解决办法

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值