参考:https://zhuanlan.zhihu.com/p/60170376
fastjson:https://blog.youkuaiyun.com/weixin_43287478/article/details/103889295
HttpMessageConverter解读:https://segmentfault.com/a/1190000012658289
1.概述
HttpMessageConverter<T>
是Spring中的一个接口,负责将请求参数 转换成java类型参数(类型为T);或者将java类型数据 写入到http响应体中。
HttpMessageConverter接口的工作原理:
【注意】:有很重要的一点需要说明一下,springmvc可以同时配置多个Converter,根据一定的规则(主要是Content-Type
、Accept、controller方法的consumes/produces、Converter.mediaType以及Converter的排列顺序这四个属性)来选择到底是使用哪一个。
若要转换json格式数据,那么就需要使用json的消息转换器来进行 转换处理。
如果要进行json格式数据的转换
那么必须在容器中注入能够处理json数据的消息转换器,举个栗子:可以注入MappingJackson2HttpMessageConverter
这个类型的bean到IOC容器中,告诉springmvc我们需要进行Json格式的转换,MappingJackson2HttpMessageConverter
是HttpMessageConverter
接口 的一种实现。springboot中 默认的使用的json消息转换器实现 就是它。
如何在容器中注入MappingJackson2HttpMessageConverter
这个bean?
在springmvc
应用中,我们只需要 在pom中加入如下3个jackjson相关的依赖,则MappingJackson2HttpMessageConverter
对象 就会自动的注入到IOC容器中,作为HttpMessageConverter
的一种实现。
若是SpringBoot
应用,则web-stater
依赖中默认就引入了jackson
相关的依赖,使用jackson作为 json格式数据的消息转化器实现 。
jackson处理器中 提供了对 日期格式的默认处理方法,但是不满足我们的要求,我们需要设置 新的日期处理方法。
一般情况下日期的Java类型 和 数据库类型为
Java类型为:private Date createTime = new Date();
数据库类型为:
jackson默认对日期格式的处理结果:
重新设置了json日期格式后的结果:
2.解决json格式的日期输出的两种办法:
2.1 第一种:在日期字段上使用注解@JsonFormat
缺点:硬编码,这个是局部处理。
优点:灵活,想给哪个时间字段 格式化就给哪个时间字段格式化。
/** java8以前使用的 日期类型*/
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private Date lastUpdate;
/** java8 日期类型*/
@JsonFormat(pattern="yyyy-MM-dd", timezone="Europe/Zagreb")
private LocalDate birthday;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private LocalDateTime lastUpdate;
2.2 第二种:在application.yml
中进行 全局配置
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss #
joda-date-time-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
优点:如果我们要为应用程序中的 所有日期 都配置默认格式,那么这种配置的方式是最推荐的。
缺点:这种方法存在缺陷。它不适用于Java 8日期类型如 LocalDate
和 LocalDateTime
。我们只能使用它来格式化java.util.Date
或 java.util.Calendar
类型的字段 。
【兼容Java8日期格式的全局处理办法:】
兼容Java8
及Date
类型的日期格式,那么我们需要创建一个Jackson2ObjectMapperBuilderCustomizer
的bean对象:
@Configuration
public class ContactAppConfig{
private static final String dateFormat ="yyyy-MM-dd";
private static final String dateTimeFormat ="yyyy-MM-dd HH:mm:ss";
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer(){
return builder ->{
builder.simpleDateFormat(dateTimeFormat);
//java8日期格式的json处理
builder.serializers(newLocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
builder.serializers(newLocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
};
}
}
上面的示例它适用于Java 8和遗留日期类型。我们必须定义一个bean并覆盖其默认Bean,来设置我们所需的格式。 虽然这种方法可能看起来有点麻烦,但它的优点在于它适用于Java 8和遗留日期类型。
3.若想使用fastjson作为消息转换器?
fastjson是阿里巴巴的一个开源json解析框架,是目前解析速度最快的开源框架。
使用:
1、添加依赖
首先需要除去 web-starter中 默认的jackson的依赖。
<!--除去 web-starter中 默认的jackson的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2、自定义提供一个FastJsonHttpMessageConverter
@Configuration
public class MyFastJsonConfig {
@Bean
FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
//配置日期 序列化后的格式
config.setDateFormat("yyyy-MM-dd HH:mm:ss");
converter.setFastJsonConfig(config);
return converter;
}
}
参考:https://blog.youkuaiyun.com/weixin_43287478/article/details/103889295