接口返回数据相关
使用@ResponseBody后返回NUll
使用@RequestMapping返回中文乱码
原因分析:(网上基本都是一致的答案)
首先: 确定的是(经过多次测试的结果)只有当返回值是 String时才会出现中文乱码,而当返回值是Map<String, Object>或者是其它类型时,并没有中文乱码的出现.
- public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
尝试方法一: 在配置文件中的mvc:annotation-driven中添加如下代码
- <mvc:annotation-driven >
- <!-- 消息转换器 -->
- <mvc:message-converters register-defaults="true">
- <bean class="org.springframework.http.converter.StringHttpMessageConverter">
- <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
- </bean>
- </mvc:message-converters>
- </mvc:annotation-driven>
原理: StringHttpMessageConverter的父类里有个List<MediaType> supportedMediaTypes属性,用来存放 StringHttpMessageConverter支持需特殊处理的 MediaType 类型,如果需处理的 MediaType 类型不在 supportedMediaTypes列表中,则采用默认字符集。
尝试方法二: 在配置文件中的mvc:annotation-driven中添加如下代码
- <mvc:annotation-driven>
- <mvc:message-converters>
- <bean class="org.springframework.http.converter.StringHttpMessageConverter">
- <property name="supportedMediaTypes">
- <list>
- <span style="white-space:pre"> </span> <value>text/html;charset=UTF-8</value>
- <value>application/json;charset=UTF-8</value>
- <value>*/*;charset=UTF-8</value>
- </list>
- </property>
- </bean>
- </mvc:message-converters>
- </mvc:annotation-driven>
原理: 原理同上,但是这里多加了几个value。
尝试方法三: 在@RequestMapping里的配置produces="text/html;charset=UTF-8;"
- @RequestMapping(value = "***",produces="text/html;charset=UTF-8;")
原理: 手动给对应的Accept返回制定格式编码数据。
尝试方法四: 在@RequestMapping里的并发配置produces={"application/json;","text/html;charset=UTF-8;"}
- @RequestMapping(value = "***",produces={"application/json;","text/html;charset=UTF-8;"})
原理: 手动给对应的Accept返回制定格式编码数据。
尝试方法五: 在@RequestMapping里的并发配置produces={"text/html;charset=UTF-8;","application/json;"}
- @RequestMapping(value = "***",produces={"text/html;charset=UTF-8;","application/json;"})
注意: 这里和上个方法的区别是,produces里面的顺序对调了
方法四和方法五对比分析:
produces={"text/html;charset=UTF-8;","application/json;"}
这样设置,这样普通浏览器的请求就能正常显示中文,而客户端的模拟请求(可以是ajax或http)则手动指定Accept的charset,即可正常接收中文。
客户端使用Ajax请求跨域问题
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
- <span style="white-space:pre"> </span>$.ajax(url, {
- data: data,
- dataType: "jsonp",
- jsonpCallback: 'testGetData',
- timeout: "15000", //超时时间设置为3秒;
- type: "POST",
- success: function(response) {
- var result = 'success:' + JSON.stringify(response);
- //返回的是utf8编码,需要手动转为utf16
- console.log(result);
- //alert(result);
- },
- error: function(error) {
- var result = 'error:' + JSON.stringify(error);
- console.log(result);
- //alert(result);
- }
- });
JSONP传递Java Web后台代码片段:
- //判断是否是jsonp请求
- String jsoncallback = request.getParameter("callback");
2.判断如果是JSONP的请求则用JSONP的返回参数,否则用正常的(示例里面使用了Jackson来辅助)
- public static String getJsonPData(String callbackName,Map<String, Object> data) throws JsonGenerationException, JsonMappingException, IOException{
- ObjectMapper mapper = new ObjectMapper();
- String json = mapper.writeValueAsString(data);
- System.out.println("jsonp回调:"+callbackName);
- System.out.println("jackson解析的字符串:"+json);
- String result = "";
- if(callbackName==null||callbackName==""){
- //普通请求
- result = json;
- }else{
- //jsonp请求,返回的格式是类似于一个函数的字符串形式(前端再执行这个回调来获取数据)
- result = callbackName+"("+json+")";
- }
- System.out.println("最终结果:"+result);
- return result;
- }
博客主要围绕SpringMVC接口返回数据相关问题展开。包括使用@ResponseBody后返回null,使用@RequestMapping返回中文乱码的原因及五种解决方法,还介绍了客户端使用Ajax请求的跨域问题,给出了Ajax请求代码及JSONP传递Java Web后台代码片段。
2万+

被折叠的 条评论
为什么被折叠?



