解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理
有时在spring mvc中返回json格式的response的时候会使用@responsebody注解,不过在处理java8中时间的时候会很麻烦,一般我们使用的httpmessageconverter是mappingjackson2httpmessageconverter,它默认返回的时间格式是这种:
"startdate" : { "year" : 2010, "month" : "january", "dayofmonth" : 1, "dayofweek" : "friday", "dayofyear" : 1, "monthvalue" : 1, "hour" : 2, "minute" : 2, "second" : 0, "nano" : 0, "chronology" : { "id" : "iso", "calendartype" : "iso8601" } }
但是我们不会返回这种给前端使用,针对localdate想要返回的格式是2016-11-26,而localdatetime想要返回的格式是2016-11-26 21:04:34这样的数据。通过项目研究并查阅相关资料,这里介绍下个人研究中实现的两种方式。
解决方法一:
若是maven项目,在pom中引入下面的jar包:
<dependency> <groupid>com.fasterxml.jackson.datatype</groupid> <artifactid>jackson-datatype-jsr310</artifactid> <version>2.8.5</version> </dependency>
然后在你想要json化的pojo字段的get函数上加上一个@jsonserializer注解,如下
import com.fasterxml.jackson.annotation.jsonformat; @jsonformat(shape = jsonformat.shape.string, pattern = "yyyy-mm-dd") public localdatetime getbirthday() { return this.logintime; } @jsonformat(shape = jsonformat.shape.string, pattern = "yyyy-mm-dd hh:mm:ss") public localdatetime getlastlogintime() { return this.logintime; }
这种方式的优点是可以针对具体域类型设置不同显示方式,然而优点也是缺点,因为每个日期属性都要手动添加,实际中日期属性又是普遍必备,并且需要额外引入jsr310的jar包。
解决方法二:
继承objectmapper来实现返回json字符串。mappingjackson2httpmessageconverter主要通过objectmapper来实现返回json字符串。这里我们编写一个jsonutil类,获取objectmapper以针对java8中新的日期时间api,注册相应的jsonserializer<t>。
/** * json处理工具类 * * */ @component public class jsonutil { private static final objectmapper mapper; public objectmapper getmapper() { return mapper; } static { mapper = new objectmapper(); simplemodule module = new simplemodule(); module.addserializer(localdate.class, new localdateserializer()); module.addserializer(localtime.class, new localtimeserializer()); module.addserializer(localdatetime.class, new localdatetimeserializer()); mapper.registermodule(module); } public static string tojson(object obj) { try { return mapper.writevalueasstring(obj); } catch (exception e) { throw new runtimeexception("转换json字符失败!"); } } public <t> t toobject(string json, class<t> clazz) { try { return mapper.readvalue(json, clazz); } catch (ioexception e) { throw new runtimeexception("将json字符转换为对象时失败!"); } } } class localdateserializer extends jsonserializer<localdate> { private static final datetimeformatter dateformatter = datetimeformatter.ofpattern("yyyy-mm-dd"); @override public void serialize(localdate value, jsongenerator jgen, serializerprovider provider) throws ioexception, jsonprocessingexception { jgen.writestring(dateformatter.format(value)); } } class localdatetimeserializer extends jsonserializer<localdatetime> { private static final datetimeformatter datetimeformatter = datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss"); @override public void serialize(localdatetime value, jsongenerator jgen, serializerprovider provider) throws ioexception, jsonprocessingexception { jgen.writestring(datetimeformatter.format(value)); } } class localtimeserializer extends jsonserializer<localtime> { private static final datetimeformatter timeformatter = datetimeformatter.ofpattern("hh:mm:ss"); @override public void serialize(localtime value, jsongenerator jgen, serializerprovider provider) throws ioexception, jsonprocessingexception { jgen.writestring(timeformatter.format(value)); } }
然后在springmvc的配置文件中,再将<mvc:annotation-driven/>改为以下配置,配置一个新的json转换器,将它的objectmapper对象设置为jsonutil中的objectmapper对象,此转换器比spring内置的json转换器优先级更高,所以与json有关的转换,spring会优先使用它。
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.mappingjackson2httpmessageconverter"> <property name="objectmapper" value="#{jsonutil.mapper}" /> <property name="supportedmediatypes"> <list> <value>application/json;charset=utf-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
然后java8中的几种日期和时间类型就可以正常友好的显示了。优点是全局统一管理日期和时间等类型,缺点对pojo中的某个域做特殊处理。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。