SpringBoot统一处理Json数据的日期格式

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

你可能感兴趣的:(笔记)