SpringBoot统一处理Json数据的日期格式
1.伪代码示例
User.java
@Getter
@Setter
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Date birthday;
}
UserController.java
@RestController
public class UserController {
@GetMapping("/user")
public User getUser(){
return new User(18L, "张三", new Date());
}
}
2.返回结果
- 2.1 当我们采用默认的方式,不做任何处理,访问该服务,返回的格式为:
{"id":18,"name":"张三","birthday":"2019-09-25T08:22:31.287+0000"}
- 2.2 通常我们采用的做法是,在日期类型字段上贴 @JsonFormat方式来设置格式
@JsonFormat(pattern = "yyyy-MM-dd") private Date birthday;
{"id":18,"name":"张三","birthday":"2019-09-25"}
- 2.3 这样带来的问题是:如果有多个bean中,存在多个日期字段,这样处理起来就很麻烦,很难做到统一,而且一旦改变格式,需要逐个修改.
2.使用springboot提供的方式来统一处理
-
因为SpringBoot对Jackson和Gson做了自动化配置,大家可以通过以下路径进去查看.springboot中默认是采用了jackson,如果用户想使用gson,直接添加依赖即可.
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration org.springframework.boot.autoconfigure.http.GsonHttpMessageConvertersConfiguration
-
进入JacksonHttpMessageConvertersConfiguration 配置类
@Bean @ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class, ignoredType = { "org.springframework.hateoas.mvc.TypeConstrainedMappingJackson2HttpMessageConverter", "org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter" }) public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) { return new MappingJackson2HttpMessageConverter(objectMapper); }
-
通过 @ConditionOnMissingBean可知,我们可自定义一个配置,来覆盖该消息转换器
-
方式一 :重新定义MappingJackson2HttpMessageConverter
@Configuration public class WebMvcConfig { @Bean MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){ MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); mapper.setDateFormat(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒")); converter.setObjectMapper(mapper); return converter; }
-
方式二: 重新定义ObjectMapper
public class WebMvcConfig { @Bean ObjectMapper jacksonObjectMapper(){ ObjectMapper mapper = new ObjectMapper(); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); return mapper; } }
因为通过方式一得知,真正的修改格式是通过ObjectMapper类实现的.我们可以进入自动配置类
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration查看 -
关键代码
@Bean @Primary @ConditionalOnMissingBean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { return builder.createXmlMapper(false).build(); }
最后,那么方式一和方式二同时使用的话,可以吗?答案是可以的,有个优先级:
同时配置的话MappingJackson2HttpMessageConverter优先级高于ObjectMapper