在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中處理日期的方式有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!