控制器的处理方法使用@ResponseBody注解向前台页面以JSON格式进行数据传递的时候,若返回值是中文字符串,则会出现中文乱码,原因是消息转换器中StringHttpMessageConverter中固定了转换字符编码,则“ISO-8859-1”。
一、JSON数据传递中文乱码问题
常用的两种解决方法
1、在控制器处理方法上的@RequestMapping注解中配置produces
@RequestMapping(value="/view",method=RequestMethod.GET,
produces={"application/json;charset=UTF-8"})
@ResponseBody
public Object view(@RequestParam String id){
//省略处理请求内容
return obj;
}
注:
- produces:指定返回的内容类型。
produces={"application/json;charset=UTF-8"}
:
表示该处理方法将产生JSON格式的数据,此时会根据请求报文头中的Accept进行匹配,若请求报文头"Accept:application/json"
时即可匹配,并且字符串的转换编码为"UTF-8"。
2、一次性永久配置:装配消息转换器StringHttpMessageConverter,设置字符编码为UTF-8,修改配置文件Spring MVC配置文件springmvc-servlet.xml,如下
<!-- 装配消息转换器StringHttpMessageConverter,解决中文乱码 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
注: 在上面配置中,通过设置 StringHttpMessageConverter 中的supportedMediaTypes 属性指定媒体类型为application/json
,字符编码为"UTF-8"。
二、JSON数据传递的日期格式问题
Spring MVC中使用@ResponseBody返回JSON数据时,日期格式默认显示为时间戳(如:517939003300),所以需要转换时间为可读格式如:yyyy-MM-dd。
此处有两种解决方法:
注:以下两种解决方式需要导入JSON包 fastjson-1.2.13.jar
1、注解方式:@JSONField(format=“yyyy-MM-dd”)
直接给需要转换的日期类型属性标注该注解
例:
package cn.smbms.pojo;
import java.util.Date;
import java.util.List;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;
import com.alibaba.fastjson.annotation.JSONField;
/**
* 用户实体类
* @author 14062
*
*/
public class User implements java.io.Serializable{
private Integer id; //主键id
private String userPassword; //用户密码
private Integer gender; //性别
@JSONField(format="yyyy-MM-dd")
private Date birthday; //出生日期
//省略getter/setter方法
}
注:
- format参数指定转换后的日期格式
- 此种方式简单直接,但是存在一定的缺点:代码具有强侵入性,紧耦合,并且修改麻烦,所以一般不采用这种硬编码的方式来处理。
2、配置FastJson的消息转换器-----FastJsonHttpMessageConverter
在Spring MVC中,需要进行JSON转换时,通常会使用FastJson提供的FastJsonHttpMessageConverter 来完成。使用FastJsonHttpMessageConverter 的序列化属性WriteDateUseDateFormat 配置使用默认日期类型。
修改SpringMVC 配置文件springmvc-servlet.xml
<mvc:annotation-driven>
<mvc:message-converters>
<!--配置FastJsonHttpMessageConverter消息转换器,解决日期格式问题 -->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=utf-8</value>
<value>application/json</value>
</list>
</property>
<property name="features">
<list>
<!--输出Date的日期转换器 -->
<value>WriteDateUseDateFormat</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
小结:
- 若没有配置消息转换器的
<value>WriteDateUseDateFormat</value>
,并且也没有加入属性注解@JSONField(format="yyyy-MM-dd")
,则转换为会输出时间戳。 - 若只配置了
<value>WriteDateUseDateFormat</value>
,则会转换输出 yyyy-MM-dd HH:mm:ss 格式的日期。 - 若只配置了
<value>WriteDateUseDateFormat</value>
,
则会转换输出yyyy-MM-dd HH:mm:ss格式的日期。