一、引言
在开发web应用中,我们经常会涉及到日期类型的数据,在服务器的日期格式与前端的日期格式不同的情况下,我们必须对日期进行格式化处理。本篇文章将介绍如何在SpringBoot2.0项目中整合jackson实现日期格式化和反序列化的功能。
二、依赖
在pom.xml中添加如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.5</version>
</dependency>
</dependencies>
三、配置
在SpringBoot2.0中,我们可以通过配置文件来配置jackson,如果我们的项目使用的是默认配置,那么日期在序列化和反序列化时会格式化成Unix时间戳。所以我们需要配置jackson来进行日期格式化。
在application.properties或者application.yml中添加如下配置:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
这里我们配置的是日期格式化为“年-月-日 时:分:秒”,你也可以选择其他格式,具体的日期格式化方式可以参考java.text.SimpleDateFormat。
接下来,我们需要对日期进行反序列化配置,在SpringBoot2.0中,我们可以通过实现WebMvcConfigurer接口来配置jackson。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// 配置自定义的jackson类型转换器
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 自定义jackson类型转换器
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
converter.setObjectMapper(objectMapper);
converters.add(converter);
}
}
在configureMessageConverters方法中,我们自定义了一个jackson类型转换器,并配置了日期格式化为“年-月-日 时:分:秒”。
同时,为了避免反序列化时的安全问题,我们还配置了objectMapper的属性DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,这个属性的作用是在JSON中包含未知属性时抛出异常。
四、示例
- 序列化
我们在代码中定义一个日期类型的属性,并在代码中将其转换为JSON格式:
@Data
public class User {
private Long id;
private String name;
private Date birthday;
public User(Long id, String name, Date birthday) {
this.id = id;
this.name = name;
this.birthday = birthday;
}
}
@RestController
public class UserController {
@GetMapping("/user")
public User getUser() {
return new User(1L, "小明", new Date());
}
}
此时,我们在浏览器中访问http://localhost:8080/user,返回的JSON格式为:
{"id":1,"name":"小明","birthday":1599483537526}
由于我们在配置文件中配置了日期格式化为“年-月-日 时:分:秒”,所以返回的日期格式为Unix时间戳。但是我们期望的是日期格式化为“年-月-日 时:分:秒”,所以我们需要在配置文件中进行相应配置。
在application.yml中添加日期格式化配置:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
再次访问http://localhost:8080/user,返回的JSON格式为:
{"id":1,"name":"小明","birthday":"2020-09-07 10:25:37"}
- 反序列化
我们在代码中定义一个User类,并在代码中使用@RequestBody将JSON格式的数据转换为User对象:
@Data
public class User {
private Long id;
private String name;
private Date birthday;
}
@RestController
public class UserController {
@PostMapping("/user")
public User addUser(@RequestBody User user) {
return user;
}
}
此时,我们使用Postman发送如下JSON格式的数据:
{
"id": 1,
"name": "小明",
"birthday": "2020-09-07 10:25:37"
}
这里我们的日期格式是“年-月-日 时:分:秒”,如果没有进行日期格式化配置,此时会抛出异常。但我们已经在WebMvcConfigurer中自定义了jackson类型转换器,并配置了日期格式化为“年-月-日 时:分:秒”,所以我们能够成功将JSON格式的数据转换为User对象。
至此,SpringBoot2.0整合jackson配置日期格式化和反序列化的实现就完成了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot2.0整合jackson配置日期格式化和反序列化的实现 - Python技术站