问题描述:
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;而每次打包都会导致自定义配置和废弃配置类在被读取时顺序进行改变,从而导致了时好时不好的问题。
到此这篇tomcat乱码有影响吗(tomcat出现乱码)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/65013.html