快速体验 jackson
jackson是spring boot 默认的json解析方案,当我们创建maven工程引入 spring-boot-starter-web
时 jackson的相关依赖就以及自动引入了,如下,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
下面就是引入了包含jackson在内的相关依赖
接下来,我们来快速体验一下,创建UserController
类和User
实体类
@RestController
public class UserController {
@GetMapping("/user")
public User getUser() {
User user = new User();
user.setId(1);
user.setUserName("name");
user.setCreateDate(new Date());
return user;
}
}
public class User {
private int id;
private String userName;
private Date createDate;
getter/setter...
}
启动工程,浏览器或者其他工具访问localhost:8080/user,可以看到User对象已经解析成(序列化)json格式的数据,如下:
这里我用一个JSONView的插件,所以数据看起来比较格式化。
springboot 对 jackson自动化配置
我们什么也没做怎么就把java对象转成了json?这是因为spring boot帮我我们做了自动化配置,关于jackson的自动化配置类在包org.springframework.boot.autoconfigure.http下,从在这个包下还有其他的配置类,比如Gson。
JacksonHttpMessageConvertersConfiguration就是jackson的自动化配置类,这个类中如果我们没有提供MappingJackson2HttpMessageConverter的话,它会自动给我们提供,前提是我们没有提供,这就实现了自动化配置。下面是源码片段,
static class MappingJackson2HttpMessageConverterConfiguration {
@Bean
@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class,
ignoredType = {
"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter",
"org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter" })
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
return new MappingJackson2HttpMessageConverter(objectMapper);
}
}
由此,我们是不是可以自己提供MappingJackson2HttpMessageConverter,然后做一些自定义的配置,当然是可以的,下面我们就自定义jackson的时间格式为yyyy/MM/dd
。
自定义配置类修改jackson的时间格式
我们只需要定义一个配置类,提供一个MappingJackson2HttpMessageConverter 对象就可以了。ObjectMapper 是jackson提供一个重要的类,可以相互转换java对象和json字符串。源码中ObjectMapper 是作为参数传进来,现在我们需要创建出ObjectMapper 对象并设置MappingJackson2HttpMessageConverter的objectMapper属性。
@Configuration
public class WebMvcConfig {
@Bean
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper); // 设置objectMapper
return mappingJackson2HttpMessageConverter;
}
}
配置完成,运行启动类,看下效果,是起了作用的。
当然还有另外一种方式定义时间格式,那就是在需要转换的类中的属性上使用 @JsonFormat 注解,即使我们配置了MappingJackson2HttpMessageConverter,时间格式还是会使用注解里面的。
@JsonFormat(pattern = "yyyy-MM-dd")
private Date createDate;
进一步简化配置类修改时间格式
在上面的配置类我们不仅提供了一个MappingJackson2HttpMessageConverter 对象,还创建了一个ObjectMapper对象,源码中在创建MappingJackson2HttpMessageConverter对象时ObjectMapper是作为参数传进来的,ObjectMapper对象是在org.springframework.boot.autoconfigure.jacksonJacksonAutoConfiguration配置类中创建的,下面是源码片段,意思是如果没有提供ObjectMapper就创建。
@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)
static class JacksonObjectMapperConfiguration {
@Bean
@Primary
@ConditionalOnMissingBean
ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false).build();
}
}
那么我们只需要提供一个ObjectMapper对象就可以实现修改时间格式的需求。
@Configuration
public class WebMvcConfig {
// @Bean
// MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
// MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
// ObjectMapper objectMapper = new ObjectMapper();
// objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
// mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper); // 设置objectMapper
// return mappingJackson2HttpMessageConverter;
// }
@Bean
ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
return objectMapper;
}
}