tomcat乱码有影响吗(tomcat出现乱码)

tomcat乱码有影响吗(tomcat出现乱码)p strong 问题描述 strong p maven 打包后 有时候打好的 jar 包启动之后接口返回的中文是乱码 此时需要重复打包 直至接口正常 初步排查 打一个乱码包 一个正常的包 使用 remoteDebug 进行调试 断点定位至接口返回 发现返回正常

大家好,我是讯享网,很高兴认识大家。



 <p><strong>问题描述&#xff1a;</strong></p> 

讯享网

maven打包后,有时候打好的jar包启动之后接口返回的中文是乱码,此时需要重复打包,直至接口正常。

初步排查:

打一个乱码包,一个正常的包,使用remoteDebug进行调试。

断点定位至接口返回,发现返回正常,判断是springmvc对response的转换有问题。

进一步debug,发现HttpMessageConverter的编码是ISO,初步判断是converter的问题。


讯享网

再次排查,发现项目中存在继承WebMvcConfigurationSupport的配置类,里面定义了UTF8的converter,并且发现WebMvcConfigurationSupport在创建RequestMappingHandlerAdapter时,如果接口正常,WebMvcConfigurationSupport的子类为自定义配置类;接口乱码,子类为DelegatingWebMvcConfiguration。

再次排查:

经过在网上查阅资料,发现DelegatingWebMvcConfiguration是@EnableWebMvc注解进行的import,全局搜索,果然项目中存在一个@EnableWebMvc的注解的废弃配置类。将该注解删除,多次重新打包,接口正常,乱码问题解决。说明生成RequestMappingHandlerAdapter时,Configuration加载有问题。

项目里出现两个配置类继承WebMvcConfigurationSupport时,为什么只有一个会生效(源码分析)-腾讯云开发者社区-腾讯云

通过上面这篇博客了解到,只有一个会生效。但这解释不了为什么有时候打包ok,有时候打包乱码。

进一步排查:

通过debug源码发现,spring在对basepackage扫描component时,scanCandidateComponents这个方法,是通过PathMatchingResourcePatternResolver对jar包内的class文件进行扫描,匹配。如果废弃配置类先被扫描到(按照只有一个会生效的原理,先被扫描到的,会先加载),那么就会使DelegatingWebMvcConfiguration生效。

扫描class文件的顺序是由JarFile.entries决定的,再向下走就是maven打包的问题了,maven打包决定了class文件的顺序,根据文心一言(感觉不一定对),maven打包每次都是无序的,jvm加载也是无序的(一般情况下)。

总结:

综合以上几点,项目中引入了@EnableWebMvc注解导致import了DelegatingWebMvcConfiguration,此时spring容器内有两个WebMvcConfigurationSupport的子类;spring在扫描组件时,先扫到哪个子类,哪个子类就会用于加载HttpMessageConverter;而每次打包都会导致自定义配置和废弃配置类在被读取时顺序进行改变,从而导致了时好时不好的问题。

小讯
上一篇 2025-05-21 11:38
下一篇 2025-05-09 09:02

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/151026.html