欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

解决DeferredResult 使用 @ResponseBody 注解返回中文乱码

发布时间:2024/9/21 编程问答 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 解决DeferredResult 使用 @ResponseBody 注解返回中文乱码 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Spring MVC 项目在使用 DeferredResult 实现异步接口,但返回中文乱码,显示的都是问号。

相关代码:

/*** 长轮询* * @return*/@RequestMapping(value = "ctrldf.do", method = RequestMethod.GET)@ResponseBodypublic DeferredResult<Map<String, String>> DeferredControl(HttpServletRequest request,HttpServletResponse response) throws Exception {// 设置响应内容编码,解决直接在浏览器地址栏访问中文内容乱码的问题response.setCharacterEncoding("utf-8");// 设置响应内容类型response.setContentType("application/json");DeferredResult<Map<String, String>> result = new DeferredResult<Map<String, String>>(10000l, null); // 设置超时10s,超时返回nullPersonal personal = SecurityUtils.getPersonal(request);Long personalId = personal.getId();if (personalId == null) {// outFailureJson(response, BaseCodeMessage.personal_10001);result.setErrorResult(BaseCodeMessage.personal_10001);return result;}Long familyId = personal.getFamilyId();if (familyId == null) {// outFailureJson(response, "1", "家庭编号不能为空");result.setErrorResult("家庭编号不能为空");return result;} }

其中尝试使用

// 设置响应内容编码,解决直接在浏览器地址栏访问中文内容乱码的问题response.setCharacterEncoding("utf-8");// 设置响应内容类型response.setContentType("application/json");发现根本不起作用。

解决方法:

需要在 spring-mvc.xml 中添加以下内容:

<!--避免IE执行AJAX时,返回JSON出现下载文件 --><bean id="mappingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/plain;charset=UTF-8</value><value>text/html;charset=UTF-8</value></list></property></bean><beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 --></list></property></bean><mvc:annotation-driven />最初我是只添加了:

<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --><beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"><property name="messageConverters"><list><ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 --></list></property></bean>这样子使用 以下代码 是没有乱码的。

相关代码如下:

@RequestMapping("/savegw.do")@ResponseBodypublic void savegw(HttpServletRequest request, HttpServletResponse response) throws Exception { // 设置响应内容编码,解决直接在浏览器地址栏访问中文内容乱码的问题response.setCharacterEncoding("utf-8");// 设置响应内容类型response.setContentType("text/plain");try {OutputStream out = response.getOutputStream();if (content == null){content = "";}out.write(content.getBytes());out.close();} catch (IOException e) {e.printStackTrace();} }有什么区别呢?

上面的方法返回值是 DeferredResult, 而这里返回值是 void。

另外看到有的文章中提到:

<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/plain;charset=utf-8</value><value>text/html;charset=UTF-8</value></list></property></bean>不知是用于什么情况。

注意:有文章提到 上面配置的 xml 必须在 <mvc:annotation-driven /> 之上,这个

总结

以上是生活随笔为你收集整理的解决DeferredResult 使用 @ResponseBody 注解返回中文乱码的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。