SpringMVC 设置全局DateTime json返回格式

对于部分返回DateTime的项目,只需要在指定属性上添加@JsonSerialize 使用自定义的json转换格式即可自定义返回DateTime格式

但是对于项目中返回有多个DateTime字段来说,上面的方法明显不适用,这时需要自定义全局的DateTime转换器:

1、配置文件:

	<!-- 采用SpringMVC自带的JSON转换工具,支持@ResponseBody注解 -->
	<bean
		class=" org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

		<property name="messageConverters">
			<list>
				<ref bean="mappingJacksonHttpMessageConverter" />
			</list>
		</property>

	</bean>
   <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
	<bean id="mappingJacksonHttpMessageConverter"
		class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>application/json;charset=UTF-8</value>
				<value>text/html;charset=UTF-8</value>
			</list>
		</property>
		<property name="objectMapper">
			<bean class="com.cml.mvc.framework.converter.DateTimeConverter"></bean>
		</property>
	</bean>

主要是在mappingJacksonHttpMessageConverter中自定义objectMapper

2、下载需要的jar

               <dependency>
			<groupId>com.fasterxml.jackson.datatype</groupId>
			<artifactId>jackson-datatype-joda</artifactId>
			<version>${jackson.mapper}</version>
		</dependency>

3、自己实现ObjectMapper

public class DateTimeConverter extends ObjectMapper {

	private static final long serialVersionUID = 1L;

	public DateTimeConverter() {
		this.registerModule(new BaseJodaModule());
		this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
	}
}

BaseJodaModule主要是修改com.fasterxml.jackson.datatype.joda.JodaModule代码,只需要在DateTime注册转换器上传入自定义日期格式即可

4、BaseJodaModule

package com.cml.mvc.framework.converter.datetime;

import org.joda.time.DateMidnight;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Duration;
import org.joda.time.Instant;
import org.joda.time.Interval;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.LocalTime;
import org.joda.time.MonthDay;
import org.joda.time.Period;
import org.joda.time.ReadableDateTime;
import org.joda.time.ReadableInstant;
import org.joda.time.ReadablePeriod;
import org.joda.time.YearMonth;
import org.joda.time.format.DateTimeFormat;

import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.joda.PackageVersion;
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
import com.fasterxml.jackson.datatype.joda.deser.DateMidnightDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.DateTimeZoneDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.DurationDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.InstantDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.IntervalDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.MonthDayDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.PeriodDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.YearMonthDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.key.DateTimeKeyDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.key.LocalDateKeyDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.key.LocalDateTimeKeyDeserializer;
import com.fasterxml.jackson.datatype.joda.deser.key.LocalTimeKeyDeserializer;
import com.fasterxml.jackson.datatype.joda.ser.DateMidnightSerializer;
import com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer;
import com.fasterxml.jackson.datatype.joda.ser.DateTimeZoneSerializer;
import com.fasterxml.jackson.datatype.joda.ser.DurationSerializer;
import com.fasterxml.jackson.datatype.joda.ser.InstantSerializer;
import com.fasterxml.jackson.datatype.joda.ser.IntervalSerializer;
import com.fasterxml.jackson.datatype.joda.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.joda.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.joda.ser.LocalTimeSerializer;
import com.fasterxml.jackson.datatype.joda.ser.PeriodSerializer;

@SuppressWarnings("deprecation")
public class BaseJodaModule extends SimpleModule {

	private static final long serialVersionUID = 1L;

	public static final String DATE_TIME_PATTERN = "yyyyMMddHHmmss";
	private static final JacksonJodaDateFormat DATE_TIME_FORMATTER = new JacksonJodaDateFormat(
			DateTimeFormat.forPattern(DATE_TIME_PATTERN).withZoneUTC());

	@SuppressWarnings({ "unchecked" })
	public BaseJodaModule() {

		super(PackageVersion.VERSION);
		// first deserializers
		addDeserializer(DateMidnight.class, new DateMidnightDeserializer());
		addDeserializer(DateTime.class,
				DateTimeDeserializer.forType(DateTime.class));
		addDeserializer(DateTimeZone.class, new DateTimeZoneDeserializer());

		addDeserializer(Duration.class, new DurationDeserializer());
		addDeserializer(Instant.class, new InstantDeserializer());
		addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
		addDeserializer(LocalDate.class, new LocalDateDeserializer());
		addDeserializer(LocalTime.class, new LocalTimeDeserializer());
		JsonDeserializer<?> deser = new PeriodDeserializer(true);
		addDeserializer(Period.class, (JsonDeserializer<Period>) deser);
		addDeserializer(ReadablePeriod.class, new PeriodDeserializer(false));
		addDeserializer(ReadableDateTime.class,
				DateTimeDeserializer.forType(ReadableDateTime.class));
		addDeserializer(ReadableInstant.class,
				DateTimeDeserializer.forType(ReadableInstant.class));
		addDeserializer(Interval.class, new IntervalDeserializer());
		addDeserializer(MonthDay.class, new MonthDayDeserializer());
		addDeserializer(YearMonth.class, new YearMonthDeserializer());

		// then serializers:
		final JsonSerializer<Object> stringSer = ToStringSerializer.instance;
		addSerializer(DateMidnight.class, new DateMidnightSerializer());
               //主要是修改这里,自定义日期格式
		addSerializer(DateTime.class, new DateTimeSerializer(
				DATE_TIME_FORMATTER));
		addSerializer(DateTimeZone.class, new DateTimeZoneSerializer());
		addSerializer(Duration.class, new DurationSerializer());
		addSerializer(Instant.class, new InstantSerializer());
		addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
		addSerializer(LocalDate.class, new LocalDateSerializer());
		addSerializer(LocalTime.class, new LocalTimeSerializer());
		addSerializer(Period.class, new PeriodSerializer());
		addSerializer(Interval.class, new IntervalSerializer());
		addSerializer(MonthDay.class, stringSer);
		addSerializer(YearMonth.class, stringSer);

		// then key deserializers
		addKeyDeserializer(DateTime.class, new DateTimeKeyDeserializer());
		addKeyDeserializer(LocalTime.class, new LocalTimeKeyDeserializer());
		addKeyDeserializer(LocalDate.class, new LocalDateKeyDeserializer());
		addKeyDeserializer(LocalDateTime.class,
				new LocalDateTimeKeyDeserializer());
	}

	// yes, will try to avoid duplicate registations (if MapperFeature enabled)
	@Override
	public String getModuleName() {
		return getClass().getSimpleName();
	}

	@Override
	public int hashCode() {
		return getClass().hashCode();
	}

	@Override
	public boolean equals(Object o) {
		return this == o;
	}

}

自定义全局DateTime json格式ok,但是个人感觉太复杂了,设置个日期格式而已,要配置,自己实现这么多步骤!期待更简单的全局配置方式。。。

时间: 2024-08-04 12:37:00

SpringMVC 设置全局DateTime json返回格式的相关文章

Echart地图城市用json返回格式

用Echarts中,使用地图的series部分中展示城市如果用json返回数据的话,js不能直接用字符串使用.需要处理一下. php中的部分 json返回的数据 js中获取json信息 用ajax实现调用 因为Echarts图表map中的展示城市需要的格式是[{name:'北京'},{name:'天津'}] 先是数组然后是对象形式的,但是js中不支持字符串格式的数据,所以我们就用js中的array()和Object()处理一下.最后push()一下. 然后我们console.log一下 如果出现

SpringMVC 学习笔记(七) JSON返回:HttpMessageConverter作用

1.1. 返回JSON 在POM.XML: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.1.4</version> </dependency> 在方法上面添加@ResponseBody注解 1.2. HttpMessageConver

ASP.Core设置全局配置json信息项

一.appsettings.json 1.添加数据 2.创建一个接收类 namespace FourTh.BaseModel { public class ThreeOption { public int BoldDepartmentElp { get; set; } } } 3.在Startup.cs配置项注册管道信息(红字部分) public class Startup { private readonly IConfiguration _configuration; public Star

spring Mvc json返回json的日期格式问题

(一)输出json数据 springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点: 1.使用mvc:annotation-driven 2.在依赖管理中添加jackson-mapper-asl <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version

Spring MVC全局异常后返回JSON异常数据

Spring MVC全局异常后返回JSON异常数据 问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内容,如果是404请求不到资源或者500这类服务器的问题,可能会导致返回404和500异常页面,手机端的处理就非常麻烦,为了解决这个问题,就需要做全局的异常处理. 解决方案: (1)自定义或者使用spring自带的各种异常处理器 例如spring基于

SpringMVC简单构造restful, 并返回json

文章要要点: 快速搭建构造restful的StringMvc GET, POST , PUT , DELETE的各种调用 同一资源 多种表述 (ContentNegotiatingViewResolver解析器),既可以返回对象给JSP, 也可以返回JSON 快速搭建构造restful的StringMvc 首现搭建一个简单的restfulMvc框架,  并上配置文件, 后期会增加带JSON返回值的配置 JAR包 web.xml配置 ? 1 2 3 4 5 6 7 8 9 10 11 12 13

struts+json 返回json格式多了斜杠的问题

功能要求 C#做http请求 ,后台 struts+json 返回json格式数据, 大概代码是这样的 后台java public String jo ; public String getNumpsQty(){ //*** JSONObject obj=new JSONObject(); JSONArray ja =JSONArray.fromObject(onv); obj.put("count", row); obj.put("root", ja); setJ

1.3WEB API 默认以json格式返回数据,同时定义时间格式,返回格式

首先我们知道,web api 是可以返回任意类型的,然后在输出的过程中转为(默认的)xml. 但是xml是比较费流量的,而且大多前端都是用json对接,所以我们也只能随大流,把它输出改成json. 不废话了,直接上代码,反正就这么点. public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.R

后端返回值以json的格式返回,前端以json格式接收

以随便一个类为例子:这个例子是查询企业主营类别前5事项 (1)后端将结果绑定到param中,然后将结果以为json的格式返回到前端 /** * 查询企业主营类别前5事项 * @param request * @param response * @param config * @throws Exception * @author hongxy * 2017年6月1日下午2:21:14 */ public void getEnterpriseMainCategory(HttpServletRequ