更新时间:2022-07-03 20:04:36
Spring MVC 项目在使用 DeferredResult 实现异步接口,但返回中文乱码,显示的都是问号。
相关代码:
/** * 长轮询 * * @return */ @RequestMapping(value = "ctrldf.do", method = RequestMethod.GET) @ResponseBody public 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,超时返回null Personal 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> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <mvc:annotation-driven />最初我是只添加了:
<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean>这样子使用 以下代码 是没有乱码的。
相关代码如下:
@RequestMapping("/savegw.do") @ResponseBody public 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 /> 之上,这个