相信这里有很多人用spring 3.1 基于注解配置的mvc,估计你们配置都大同小异,但是我要告诉你们一个你们也许没有发现的东西

ydm305365 2015-03-26 04:18:20
使用spring mvc 也有好多年了,基于注解的配置,都是这个项目拷贝到另外个项目,今天为了解决ajax 乱码,把spring 相关源码看了一下,花费了5个多小时问题终于解决,也奉劝各位在网上查资料时一定要有自己的分辨能力,有些资料要么写的不仔细,要么都是好多年前的了,这里跟大家分享一下,另外还有一个奇怪的问题大家帮忙分析一下。

spring mvc 有很多消息转换器,其他消息转换器默认编码都是utf-8,唯独StringHttpMessageConverter 用来处理返回String 字符串的却是ISO-8859-1,乱码因此产生,不明白spring为什么要这样设计.

大家的web-servlet 的多数配置都有这一句话
<mvc:annotation-driven />
这就是一种简写形式
为了更改乱码去掉<mvc:annotation-driven />,换成

<beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<beans:property name="cacheSeconds" value="0" ></beans:property>
<beans:property name="messageConverters">
<beans:list>
<beans:bean class = "org.springframework.http.converter.StringHttpMessageConverter">
<beans:property name = "supportedMediaTypes">
<beans:list>
<beans:value>text/plain;charset=UTF-8</beans:value>
</beans:list>
</beans:property>
</beans:bean>

<beans:bean class = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
</beans:list>
</beans:property>
</beans:bean>
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />




原本以为这样就好了,如果你是3.1以前的版本这样是没问题,但如果你是3.1以后的版本,这样配置没有任何效果的,而且这段代码根本就不会被初始化执行
后来发现3.1以后需要换成这样


<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="cacheSeconds" value="0" ></beans:property>
<beans:property name="messageConverters">
<beans:list>
<beans:bean class = "org.springframework.http.converter.StringHttpMessageConverter">
<beans:property name = "supportedMediaTypes">
<beans:list>
<beans:value>text/plain;charset=UTF-8</beans:value>
</beans:list>
</beans:property>
</beans:bean>

<beans:bean class = "org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
</beans:list>
</beans:property>
</beans:bean>
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />



问题解决了,但是我在排查问题的时候发现了一个问题,都说
<mvc:annotation-driven />

是定义RequestMappingHandlerMapping,RequestMappingHandlerAdapter两个bean 的简写形式,两者取一个就行了,

但是你们会不会想到,如果两个都不要是什么情况,估计很多人跟我想的一样,项目肯定跑不起来啊,但是我告诉你,项目是可以跑的起来而且还可以正常运转,你们发现了吗?不信,你们现在就去掉你们配置的<mvc:annotation-driven />,看项目能否启动,求解答

...全文
227 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ydm305365 2015-03-27
  • 打赏
  • 举报
回复
引用 1 楼 defonds 的回复:
楼主在分享?
重点是,为什么不要<mvc:annotation-driven /> ,也不自己定义,项目却能跑起来,估计那个地方设置了默认的,故求问
疯狂熊猫人 2015-03-27
  • 打赏
  • 举报
回复
百度上找资料,10个中有7个是转的,楼主才发现这个现象吗? 另外,毕竟spring的开发者是老外,英文使用iso8859-1和utf8都不会出现乱码,那不使用utf8也是说的过去的。 建议: 除了二进制文件以外,其他格式请自己实现一个messageconverter,比如利用fastjson进行统一处理。这样就上不会出现你说的情况了。
Defonds 2015-03-27
  • 打赏
  • 举报
回复
楼主在分享?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧