[Spring MVC] @ResponseBody返回结果乱码问题的解决

来源:互联网 发布:网络设计学习 编辑:程序博客网 时间:2024/04/29 02:57

发现问题

在Controller类方法上加@ResponseBody,直接返回字符串,结果乱码。

如下所示:

MockHttpServletResponse:

Status = 200

Error message = null

Headers = {Content-Type=[text/plain;charset=ISO-8859-1], Content-Length=[45]}

Content type = text/plain;charset=ISO-8859-1

Body = {

"Msg":"???????????????nameEntTypeCode??"

}

用浏览器访问也是乱码。

分析问题

1、分析日志

日志级别设为DEBUG,查看日志,节选如下:

(1)

<Method [handleRuleException] returned [{

"Msg":"调用时规则时未传入必要参数:“nameEntTypeCode”。"

}]>

到这里还是对的。Handle调用完成,获得了返回值,接下来归View了。

(2)

ModelAndViewMethodReturnValueHandler@12eae9c

] supports [class java.lang.String]>

web.method.annotation.ModelMethodProcessor@12c50a4

] supports [class java.lang.String]>

web.servlet.mvc.method.annotation.ViewMethodReturnValueHandler@56a5b

] supports [class java.lang.String]>

web.servlet.mvc.method.annotation.HttpEntityMethodProcessor@9463a0

] supports [class java.lang.String]>

web.method.annotation.ModelAttributeMethodProcessor@1aad6f4

] supports [class java.lang.String]>

web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor@1c45fa4

] supports [class java.lang.String]>

快找到元凶了。

accept.PathExtensionContentNegotiationStrategy$JafMediaTypeFactory]

Loading Java Activation Framework FileTypeMap from class path resource

[org/springframework/mail/javamail/mime.types]    //默认支持的类型是从这里读取的

mvc.method.annotation.AbstractMessageConverterMethodProcessor<Written [{

"Msg":"调用时规则时未传入必要参数:“nameEntTypeCode”。"

}] as "text/plain;charset=ISO-8859-1" using [org.springframework.http.converter.StringHttpMessageConverter@1efa83c]>

找到元凶。他是怎样作案的呢?

我猜,大概是StringHttpMessageConverter注入了AbstractMessageConverterMethodProcessor。

“text/plain;charset=ISO-8859-1”是StringHttpMessageConverter的属性。

2、尝试解决

(1)AbstractMessageConverterMethodProcessor是抽象类,在StringHttpMessageConverter上想办法。

(2)

如果org.springframework.http.converter.StringHttpMessageConverter是单例,可以自己配置一下看看

<bean id="stringHttpMessageConverter"

class="org.springframework.http.converter.StringHttpMessageConverter">

<property name="supportedMediaTypes">

<list>

<value>text/plain;charset=UTF-8</value>

</list>

</property>

</bean>

在<xxx>-servlet.xml中配置无效。确认放在<mvc:annotation-driven>之前了。

(3)注入的姿势不对,还是老实看看Spring源代码吧

3、寻找注入口

(1)

RequestMappingHandlerAdapter构造函数中:

public RequestMappingHandlerAdapter() {

StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();

...

this.messageConverters.add(stringHttpMessageConverter);

}

直接这么new啊,太粗暴了。

这只是默认行为,应该有覆盖办法的。

(2)

跟代码,跟到

private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {

List<HandlerMethodReturnValueHandler> handlers = new ArrayList<HandlerMethodReturnValueHandler>();

// Single-purpose return value types

handlers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.contentNegotiationManager));

// Annotation-based return value types

handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.contentNegotiationManager));

}

然后找到:

public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {

this.messageConverters = messageConverters;

}

(3)

试试看:

<mvc:annotation-driven>

<mvc:message-converters>

<bean class="org.springframework.http.converter.StringHttpMessageConverter">

<property name="supportedMediaTypes">

<list>

<value>text/plain;charset=UTF-8</value>

</list>

</property>

</bean>

</mvc:message-converters>

</mvc:annotation-driven>

这就是老版本的报错吧:

cvc-complex-type.2.1: 元素 'mvc:annotation-driven' 必须不含字符或元素信息项 [子级], 因为该类型的内容类型为空。

看mvc命名空间中xsd版本。

好吧,就是这里:

http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

(4)

修正,好了:

MockHttpServletResponse:

Status = 200

Error message = null

Headers = {Content-Type=[text/plain;charset=UTF-8], Content-Length=[79]}

Content type = text/plain;charset=UTF-8

Body = {

"Msg":"调用时规则时未传入必要参数:“nameEntTypeCode”。"

}

Forwarded URL = null

Redirected URL = null

Cookies = []

总结

1、遇到问题多看日志,多看代码。

2、Spring MVC注入口很多,太爽了,但应该谨慎使用,考虑影响范围。

3、 HttpMessageConverter是神器,可以完成传入参数和返回值的转换,通过自定义Media Type可实现神奇效果,有机会好好研究下。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 丝母欲韵500 我的丝母欲韵13 经典家庭伦txt丝母韵欲电子书 经典家庭伦txt丝母韵欲彩图 经典家庭伦txt丝母韵欲txt下载 经典家庭伦txt丝母韵欲d下载 经典家庭伦txt丝母韵欲视频 长篇都市情感小说 经典家庭伦全文 久九九久精品免费视频 91在线中文字幕香蕉人人视频 经典家庭伦txt岳丝母小丹韵欲阅读 碰超上线视频人人视频千人 91青青碰起上线视频人人 车里太挤姑妈坐我腿上做小说 经典家庭伦txt岳丝母小丹韵欲小说 我的丝母欲韵第六节 91在线中文久人人视频动漫 悉母全集动漫完整视频 类别中文动漫中的视频 腐母动漫全集视频时长 86 母汁视频动漫 久99久视频精品免费观看38 难以忍耐动漫视频中文 久九九久手机视频 乳娘家教动漫无删减在线播放 久99久精品视频只有精品 母恋人2017中文 久九九久视频精品6思思 巨母3动漫在线 久99久视频精品免费视频动漫 水柔姐大战儿子视频91 久九九久视频精品 99视频国内99视频在线观 横恋人母日语中字 玖玖视频热线视频大全 九九视频热线视频大全动漫 99ra视频这里只精品 九九久视频热线视频 九九久视频热线视频精品 九九视频本韩视频