最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

徹底解決Spring mvc中時(shí)間的轉(zhuǎn)換和序列化等問(wèn)題

 更新時(shí)間:2019年09月19日 09:29:00   作者:碼農(nóng)小胖哥  
這篇文章主要介紹了徹底解決Spring mvc中時(shí)間的轉(zhuǎn)換和序列化等問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

痛點(diǎn)

在使用Spring mvc 進(jìn)行開(kāi)發(fā)時(shí)我們經(jīng)常遇到前端傳來(lái)的某種格式的時(shí)間字符串無(wú)法用java8的新特性java.time包下的具體類型參數(shù)來(lái)直接接收。 我們使用含有java.time封裝類型的參數(shù)接收也會(huì)報(bào)反序列化問(wèn)題,在返回前端帶時(shí)間類型的同樣會(huì)出現(xiàn)一些格式化的問(wèn)題。今天我們來(lái)徹底解決他們。

建議

其實(shí)最科學(xué)的建議統(tǒng)一使用時(shí)間戳來(lái)代表時(shí)間。這個(gè)是最完美的,避免了前端瀏覽器的兼容性問(wèn)題,同時(shí)也避免了其它一些中間件的序列化/反序列化問(wèn)題。但是用時(shí)間表達(dá)可能更清晰語(yǔ)義化。兩種方式各有千秋,如果我們堅(jiān)持使用java8的時(shí)間類庫(kù)也不是沒(méi)有辦法。下面我們會(huì)以java.time.LocalDateTime為例逐一解決這些問(wèn)題。

局部注解方式

網(wǎng)上有很多文章說(shuō)該注解是前端指向后端的,也就是前端向后端傳遞時(shí)間參數(shù)格式化使用的,這沒(méi)有錯(cuò)!但是有一個(gè)小問(wèn)題,該方式只能適用于不涉及反序列化的情況下。也就是以下場(chǎng)景才適用:

 @GetMapping("/local")
 public Map<String, String> data(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime) {
  Map<String, String> map = new HashMap<>(1);
  map.put("data", localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
  return map;
 }

如果你在下面這個(gè)場(chǎng)景使用就不行了:

@Data
public class UserInfo {

 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 private LocalDateTime birthday;
 private String name;
 private Integer age;
}


 @PostMapping("/user")
 public Object postData(@RequestBody UserInfo userInfo) {
  System.out.println("userInfo = " + userInfo);
  return userInfo;
 }

原因是Post請(qǐng)求參數(shù)在body中,需要反序列化成對(duì)象。默認(rèn)是jackson類庫(kù)來(lái)進(jìn)行反序列化,并不觸發(fā)@DateTimeFormat注解機(jī)制。這時(shí)我們就需要使用jackson的格式化注解@JsonFormat。我們將實(shí)體類UserInfo改造成下面的就可以了:

@Data
public class UserInfo {

 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 private LocalDateTime birthday;
 private String name;
 private Integer age;
}

以上兩個(gè)注解可以并存,但是一定要清楚各自的使用場(chǎng)景。這里還有一個(gè)小細(xì)節(jié):格式一定要對(duì)應(yīng)好時(shí)間類型。比如yyyy-MM-dd 對(duì)應(yīng)java.time.LocalDate 。想再個(gè)性化一些@JsonFormat 可以被@JsonDeserialize和@JsonSerialize 代替。但是它們的using參數(shù)需要你自己實(shí)現(xiàn)為你對(duì)應(yīng)的時(shí)間類型類型。如果@JsonFormat、@JsonDeserialize和@JsonSerialize同時(shí)存在@JsonFormat的優(yōu)先級(jí)要更高。

局部處理的好處

局部處理的好處在于八個(gè)字:百花齊放,百家爭(zhēng)鳴 ??梢员3侄鄻有?、個(gè)性化 。但是局部帶來(lái)了一個(gè)新的問(wèn)題 :沒(méi)有共同的標(biāo)準(zhǔn) 、不兼容。進(jìn)而不方便維護(hù)。所以有時(shí)候基于業(yè)務(wù)需要我們?nèi)只梢越y(tǒng)一管理。下面我們將講解如何進(jìn)行全局化配置。

全局化化時(shí)間格式配置

全局化其實(shí)也是基于 @DateTimeFormat 和@JsonFormat 兩種場(chǎng)景來(lái)進(jìn)行配置。對(duì)于@DateTimeFormat的場(chǎng)景我們通過(guò)實(shí)現(xiàn)Spring提供的接口:

DateTimeFormatter :

  // 時(shí)間格式化
 private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA);

類型轉(zhuǎn)換接口:

org.springframework.core.convert.converter.Converter<S,T>

實(shí)現(xiàn):

 @Bean
 public Converter<String, LocalDateTime> localDateConverter() {
  return new Converter<String, LocalDateTime>() {
   @Override
   public LocalDateTime convert(String source) {
    return LocalDateTime.parse(source, FORMATTER);
   }
  };
 }

或者格式化接口:

org.springframework.format.Formatter<T>

實(shí)現(xiàn) :

@Bean
 public Formatter<LocalDateTime> localDateFormatter() {
  return new Formatter<LocalDateTime>() {
   @Override
   public LocalDateTime parse(String text, Locale locale) throws ParseException {
    return LocalDateTime.parse(text, FORMATTER);
   }

   @Override
   public String print(LocalDateTime object, Locale locale) {
    return object.format(FORMATTER);
   }
  };
 }

以上兩個(gè)接口的實(shí)現(xiàn)都要注冊(cè)為Spring Bean,配置的時(shí)候二者選其一即可,其中S即Source也就是來(lái)源,其實(shí)就是前端的時(shí)間字符串。T即Target也就是目標(biāo),代表你需要轉(zhuǎn)化或者格式化的時(shí)間java類型。那么對(duì)于時(shí)間序列化和反序列化我們進(jìn)行如下配置就行了(基于默認(rèn)jackson,以LocalDateTime 為例):

 @Bean
 public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {

  return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
     // 反序列化
    .deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(FORMATTER))
     // 序列化
    .serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(FORMATTER));
 }

同樣該jsonMapper自定義構(gòu)建器要注冊(cè)成Spring Bean才行。

全局配置要點(diǎn)

全局配置的一些優(yōu)缺點(diǎn)上面已經(jīng)闡述了,這里我還是要啰嗦一下要點(diǎn)避免你踩坑。全局配置跟局部配置一樣。同樣要約定pattern。這就要求我們?nèi)直3忠恢?。我們可以?shí)現(xiàn)多個(gè)以上的全局配置來(lái)對(duì)其他諸如LocalDate、OffsetDateTime 的適配。同時(shí)如果我們接入了其它一些需要用到序列化/反序列化的中間件,比如redis、rabbitmq,我們也要注意進(jìn)行適配。

總結(jié)

通過(guò)以上對(duì)時(shí)間格式的局部和全局處理方式的介紹,相信困擾你的Spring mvc 時(shí)間問(wèn)題不會(huì)再存在了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

作者:碼農(nóng)小胖哥

來(lái)源:https://segmentfault.com/a/1190000020423352

相關(guān)文章

  • spring基礎(chǔ)概念A(yù)OP與動(dòng)態(tài)代理理解

    spring基礎(chǔ)概念A(yù)OP與動(dòng)態(tài)代理理解

    這篇文章主要為大家詳細(xì)介紹了spring基礎(chǔ)概念A(yù)OP與動(dòng)態(tài)代理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java CountDownLatch與CyclicBarrier及Semaphore使用教程

    Java CountDownLatch與CyclicBarrier及Semaphore使用教程

    對(duì)于并發(fā)執(zhí)行,Java中的CountDownLatch是一個(gè)重要的類。為了更好的理解CountDownLatch這個(gè)類,本文將通過(guò)例子和源碼帶領(lǐng)大家深入解析CountDownLatch與CyclicBarrier及Semaphore的原理,感興趣的可以學(xué)習(xí)一下
    2023-01-01
  • SpringBoot結(jié)合JSR303對(duì)前端數(shù)據(jù)進(jìn)行校驗(yàn)的示例代碼

    SpringBoot結(jié)合JSR303對(duì)前端數(shù)據(jù)進(jìn)行校驗(yàn)的示例代碼

    這篇文章主要介紹了SpringBoot結(jié)合JSR303對(duì)前端數(shù)據(jù)進(jìn)行校驗(yàn)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • fasterxml jackson反序列化時(shí)對(duì)于非靜態(tài)內(nèi)部類報(bào)錯(cuò)問(wèn)題及解決

    fasterxml jackson反序列化時(shí)對(duì)于非靜態(tài)內(nèi)部類報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了fasterxml jackson反序列化時(shí)對(duì)于非靜態(tài)內(nèi)部類報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • java使用JMF實(shí)現(xiàn)音樂(lè)播放功能

    java使用JMF實(shí)現(xiàn)音樂(lè)播放功能

    這篇文章主要為大家詳細(xì)介紹了java使用JMF實(shí)現(xiàn)音樂(lè)播放的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java實(shí)現(xiàn)自動(dòng)獲取法定節(jié)假日詳細(xì)代碼

    Java實(shí)現(xiàn)自動(dòng)獲取法定節(jié)假日詳細(xì)代碼

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)自動(dòng)獲取法定節(jié)假日的相關(guān)資料,獲取并處理節(jié)假日數(shù)據(jù)是一個(gè)常見(jiàn)需求,特別是在需要安排任務(wù)調(diào)度、假期通知等功能的場(chǎng)景中,需要的朋友可以參考下
    2024-05-05
  • 詳解Java枚舉類在生產(chǎn)環(huán)境中的使用方式

    詳解Java枚舉類在生產(chǎn)環(huán)境中的使用方式

    本文主要介紹了Java枚舉類在生產(chǎn)環(huán)境中的使用方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • Java并發(fā)之異步的八種實(shí)現(xiàn)方式

    Java并發(fā)之異步的八種實(shí)現(xiàn)方式

    本文主要介紹了Java并發(fā)之異步的八種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 詳解mybatis通過(guò)mapper接口加載映射文件

    詳解mybatis通過(guò)mapper接口加載映射文件

    本篇文章主要介紹了mybatis通過(guò)mapper接口加載映射文件 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 如何解決@NotBlank不生效的問(wèn)題

    如何解決@NotBlank不生效的問(wèn)題

    這篇文章主要介紹了如何解決@NotBlank不生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

礼泉县| 祁阳县| 承德市| 长葛市| 台南市| 塘沽区| 廊坊市| 喀喇沁旗| 萍乡市| 鹤峰县| 湄潭县| 广南县| 瓮安县| 黄平县| 蓝山县| 方山县| 固原市| 定结县| 高邮市| 武乡县| 和硕县| 金塔县| 雅江县| 柘荣县| 娄烦县| 比如县| 乌审旗| 张家界市| 临颍县| 那曲县| 攀枝花市| 曲阜市| 海门市| 商洛市| 莫力| 梅州市| 柞水县| 衡水市| 闵行区| 沾益县| 华亭县|