@Response当返回类型为String的坑

今天在做一个非常简单的springmvc示例时,发现了一个非常神奇的东西
然后我为了解决这个bug就用了将近四个小时的时间。。。。

@ResponseBody
	@RequestMapping(value="/user/login",method=RequestMethod.POST)
	public String login(@RequestParam(value="username")final String username,
						@RequestParam(value="password",required=false)final String password,
						@RequestParam(value="vlacode",required=false)final String vlacode) {

可以看到我是将返回值设置为了String类型,这时在我进行测试的时候,那个神奇的东西发生了,返回给浏览器的数据竟然乱码了,我对此非常不解,以前的我没有返回过String类型,都是返回一个其他对象类型,并没有出现过这种情况。
于是我就慢慢排错,最一开始我以为编码问题吗,去配置一个编码过滤器就好了嘛,然后我就配置了一个CharacterEncodingFilter,然后发现还是不行,我看了一下源码,然后发现配置的版本不对,我以为就是版本的问题了,然后就去改版本,发现还是不行,我以为是我配错了,或者少配了东西,就去比着以前的项目改了改,然后,。。。我放弃了,去网上搜,因为我发现编码过滤器没有起作用,所以一直在去搜到底为什么编码过滤器不起作用,,,,,,结果可想而知,,,,,难受。。。。
然后我换了一个思路,因为发现只有返回String类型才会出错,然后 又去搜索了一下,原来是@ResponseBody的锅。。。。
原来spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list或其它则使用 MappingJacksonHttpMessageConverter,返回String类型时,则使用 StringHttpMessageConverter,而这个convert使用的是字符集是iso-8859-1,而且是final的。
String 返回值类型取得的媒体类型为 text/plain;charset=ISO-8859-1,且使用 StringHttpMessageConverter 消息转换类。将该媒体类型设置为 response 的 contentType, 所以在当返回json中有中文时会出现乱码。

解决办法一:
手动给对应的Accept返回制定格式编码数据。在@RequestMapping设置produces

例:

@RequestMapping(produces= "application/json;charset=utf-8",value="/user/login",method=RequestMethod.POST)

解决办法二:
修改字符编码,如 springmvc.xml 文件加上如下配置:

<mvc:annotation-driven >
    <!-- 消息转换器 -->
    <mvc:message-converters register-defaults="true">
      <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        <property name="supportedMediaTypes" value="text/plain;charset=UTF-8"/>
      </bean>
    </mvc:message-converters>
  </mvc:annotation-driven>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值