在Spring Boot中,我们通常会使用Jackson来序列化和反序列化Java对象到JSON。在进行日期序列化时,我们需要指定日期格式,否则Jackson会使用默认格式,这可能不是我们想要的。要指定日期格式,有两种方式:
如果没有处理按照默认的结果如下图: 所以我们需要通过一些手段来对日期进行处理.这里通过两个方式来解决.
方式一: 使用注解 (不推荐)
我们可以在实体类日期属性上添加@JsonFormat(),并且通过参数pattern,来格式化我们的想要的格式实例如下:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime;
此时前端就会按照我们设置的格式显示
对于上面的方法,需要我们对每一个向前端显示的日期都加上@JSONFormat这个注解,所以十分的麻烦,于是就有了方式二.通过全局异常处理.
方式二 自定义消息转换器
首先介绍Jackson包中的ObjectMapper.
ObjectMapper是Jackson库中的一个类,它的主要作用是:
将Java对象序列化为JSON/XML等格式;
将JSON/XML等格式的数据反序列化为Java对象。
所以,它是实现对象与JSON/XML互相转换的关键。
那么我们可以在这个类中做一点文章,
(1)在构造器中自定义日期转换的格式. ----也就相当于改变他的属性的初始化值.
(2)通过配置让SpringMVC在调用的时候不再调用Jackson自定义的ObjectMapper,使用我们自定的格式
下面我们就通过这两步实现.
第一步: 继承ObjectMapper,重写构造方法,自定义序列化方式
public class JacksonObjectMapper extends ObjectMapper { public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm"; public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; public JacksonObjectMapper() { super(); //收到未知属性时不报异常 this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false); //反序列化时,属性不存在的兼容处理 this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); SimpleModule simpleModule = new SimpleModule() .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))) .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); //注册功能模块 例如,可以添加自定义序列化器和反序列化器 this.registerModule(simpleModule); } }
第二步: 让Spring使用我们的自定的消息转换器
这里我们就要想了,我们应该怎么处理呢?在哪配置?配置文件? 配置类?
首先我们可以想到,系统中少不了的是拦截器,而拦截器的是不是有一个配置拦截规则的配置类.那么我们能不能再这里配置.
binggo,就是这里. 我们在配置拦截器的配置类的时候我们会发现, WebMvcConfigurationSupport 这个类有很多方法,
有我们常用的protected void addInterceptors(InterceptorRegistry registry) { ... }
配置拦截规则
public void addResourceHandlers(ResourceHandlerRegistry registry) {... }
配置资源处理
等等有很多配置方法.而我们的消息转换器
也在其中
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {...}
通过在这个方法中配置相关信息,即可改变Spring默认指定的规则,而使用我们自己定义的规则(组件)
代码如下:
@Override protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { log.info("扩展消息转换器..."); //创建一个消息转换器对象,注意不要导错包是Jackson2Http MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据 converter.setObjectMapper(new JacksonObjectMapper()); //将自己的消息转化器加入容器中 converters.add(0, converter); }
创建了一个MappingJackson2HttpMessageConverter,这是Spring MVC集成Jackson的消息转换器,可以将Java对象序列化/反序列化为JSON。
为消息转换器指定使用我们的JacksonObjectMapper, 用来将Java对象序列化/反序列化为JSON。
将刚才创建的MappingJackson2HttpMessageConverter对象加入到消息转换器列表converters中,并且加入到第一个位置,让其优先使用
由于我们重写了extendMessageConverters()方法,Spring MVC会调用这个方法并使用我们添加的消息转换器。所以,我们添加的MappingJackson2HttpMessageConverter会生效,并使用我们自定义的JacksonObjectMapper()
,用来处理对象与JSON之间的序列化和反序列化。
因为我们的消息转换器是第一个消息转换器,如果客户端要求返回JSON数据Spring MVC会选择我们的这个消息转换器进行对象序列化。
从而实现了对系统所有的日期按照我们要求的格式进行序列化.
此时前端数据也就是我们设置的格式.不在是Jackson默认的格式.
既然提到了日期,与之类似的还有一个对敏感信息的处理:
我们在返回前端数据的时候可能会因为实体类的设计,或者不想让前端能够看到该数据,此时就需要通过一些手段对数据进行一些处理, 还是两种方式.
在返回之前对数据的值进行替换, 调用set方法设置为
垃圾信息
, 比如 setPassword(“******”)是在实体类中使用Jackson提供的
@JsonIgnore
注解也可以解决,作用是忽略字段的序列化和反序列化。
以上就是SpringBoot中处理日期的方式有哪些的详细内容,更多请关注Work网其它相关文章!