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

Java中@DateTimeFormat和@JsonFormat注解介紹

 更新時間:2022年11月03日 10:47:19   作者:?陽光  
@DateTimeFormat和@JsonFormat都是處理時間格式化問題的,把其他類型轉換成自己需要的時間類型,下面這篇文章主要給大家介紹了關于Java中@DateTimeFormat和@JsonFormat注解介紹的相關資料,需要的朋友可以參考下

1.@DateTimeFormat注解

1.1@DateTimeFormat注解簡介

@DateTimeFormat注解是由Spring提供的一個注解,位于Spring和核心組件之一的context組件。對應的所需依賴如下:

# SpringBoot對應的依賴
	<dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

# Spring對應的依賴
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>

雙擊shift快捷鍵,全局搜索DateTimeFormat,查看外部庫,DateTimeFormat本質上是一個接口

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
public @interface DateTimeFormat {
   String style() default "SS";

   ISO iso() default ISO.NONE;

   String pattern() default "";

   String[] fallbackPatterns() default {};
    
   enum ISO {
      DATE,
      TIME,
      DATE_TIME,
      NONE
   }
}

1.2@DateTimeFormat注解的功能

@DateTimeFormat注解的功能是將一個日期字符串轉化為對應的Date類型,主要處理前端時間類型與后端pojo對象中的成員變量進行數據綁定,在注解屬性patttern中所約束的時間格式并不會影響后端返回前端的時間類型數據格式。。

DateTimeFormat接口的pattern屬性:

pattern屬性類型為String類型,用于格式化字段或方法參數的自定義模式。默認為空字符串,表示沒有指定自定義模式字符串。

當然也可以使用自定義日期模式字符串,如yyyy-MM-dd HH:mm:ss

1.3@DateTimeFormat注解的注意點

  • @DateTimeFormat注解既可以作用于pojo類型的屬性上,也可以作用于方法參數上。
  • 前端傳入的時間類型的字符串要和pattern屬性所規(guī)定的規(guī)則相同。
  • @DateTimeFormat注解只能處理非JSON數據格式的字符串(如url-String格式、Form-Data格式),如果要處理JSON數據格式,就需要采用@RequestBody注解,@RequestBody就是獲取請求體中的內容(即JSON字符串),再通過JSON解析庫(如Jackson、FatJosn)將JSON字符串轉換為pojo對象。

? 兩種JSON解析庫所需依賴:

        <!--       fastjson所需依賴 -->
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.54</version>
        </dependency>

? Jackson由于是Spring提供的,所以它所需的依賴就在Spring依賴中。

  • @DateTimeFormat注解只是解析日期字符串轉為Date類型,轉換后的日期格式并不會受到@DateTimeFormat注解中pattern屬性的約束。

1.4@DateTimeFormat功能演示

1.4.1類型轉換異常情況測試

pojo層

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String username;
    private Date birthday;
}

controller層

@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {

    @GetMapping("/exception")
    public User dft1(User user){
      log.info( "用戶信息是:" + user);
      return user;
    }
}

用ApiFox進行接口測試,傳輸的數據格式為url路徑傳參

請求400,查看控制臺日志信息

報錯信息:即String類型轉換為Date類型失敗

Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘birthday’; nested exception is org.springframework.core.convert

1.4.2接收url路徑傳參格式測試

pojo層

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String username;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;
}

用ApiFox進行接口測試,傳輸的數據格式為url路徑傳參

? 查看響應情況和控制臺輸出情況:可以發(fā)現(xiàn)@DateTimeFormat注解對日期字符串進行了解析,轉換為對應的Date類型

? 但是要注意@DateTimeFormat注解只是解析日期字符串轉為Date類型,轉換后的日期格式并不會受到@DateTimeFormat注解中pattern屬性的約束。

? 響應的JSON字符串數據如下:

image-20221101094616306

1.4.3接收Form-Data數據格式測試

pojo和controller都不變

用ApiFox進行接口測試,傳輸的數據格式為Form-Data類型

image-20221101100039452

測試結果:

image-20221101100453834

響應的JSON字符串數據如下:

image-20221101100026884

1.4.4接收JSON數據格式測試

? 接受JSON數據格式時,在接收參數時,通過@RequestBody獲取請求體中的內容(即JSON字符串),再通過JSON解析庫(如Jackson、FatJosn)將JSON字符串轉換為pojo對象

  • pojo層不變
  • controller層

? 通過FastJson處理JSON數據,fastjson默認使用的序列化格式就是:

DEFFAULT_DATE_FORMAT = “yyyy-MM-dd HH:mm:ss”;

@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {
    @GetMapping("/exception")
    public User dft1(@RequestBody String userMsg) {
        JSONObject jsonObject = new JSONObject();
        User user = JSONObject.parseObject(userMsg, User.class);
        log.info("用戶信息是:" + user);
        return user;
    }
}

用ApiFox進行接口測試,傳輸的數據格式為JSON類型

image-20221101100403098

測試結果:

image-20221101134006337

? 響應的JSON字符串數據如下:

image-20221101134015537

使用JSON解析庫Jackson進行解析JSON數據

controller層

@GetMapping("/exception")
public User dft1(@RequestBody String userMsg) {
    ObjectMapper objectMapper = new ObjectMapper();
    User user = null;
    try {
        user = objectMapper.readValue(userMsg, User.class);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    log.info("用戶信息是:" + user);
    return user;
}

用ApiFox進行接口測試,傳輸的數據格式為JSON類型

image-20221101100403098

測試結果

? 控制臺報錯,錯誤信息提示反序列化失敗,因為jackson默認的日期反序列不支持yyyy-MM-dd HH:mm:ss 這種格式,而是默認"yyyy-MM-dd’T’HH:mm:ss.SSSX",所以反序列化失敗。

image-20221101134337151

? 這就引出了今天要介紹的另一個注解@JsonFormat

2.@JsonFormat注解

2.1@JsonFormat注解簡介

? @JsonFormat注解是由Jackson提供的一個注解,位于Jackson的annotation包中,本身也是一個接口

image-20221101140321883

所對應的依賴如下:

<!--Jackson包-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

? SpringBoot的web依賴默認內置的有Jackson相應依賴。

image-20221101140228746

2.2@JsonFormat注解的功能

@JsonFormat注解的功能是處理請求中的JSON日期字符串和查詢數據庫中的日期類型。即可約束時間類型的請求格式和響應格式。

JsonFormat接口的pattern屬性:

pattern屬性類型為String類型,用于格式化字段或方法參數的自定義模式。默認為空字符串,表示沒有指定自定義模式字符串。

當然也可以使用自定義日期模式字符串,如yyyy-MM-dd HH:mm:ss

JsonFormat接口的timezone屬性:

東八區(qū)([UTC]/[GMT]+08:00)是比[世界協(xié)調時間](UTC)/[格林尼治時間](GMT)快8小時的時區(qū),我國就是屬于東八區(qū),所以要指定時區(qū)為"GTM+8"

2.3@JsonFormat注解的注意點

  • @JsonFormat只能作用在實體類上,不能作用于方法參數上。
  • @JsonFormat會根據pattrn屬性約束日期格式,在返回數據時會返回約束日期格式,這點和@DateTimeFormat不同
  • @JsonFormat注解需要先通過@RequestBody將入參參數映射到實體后,@JsonFormat注解才能去對時間格式進行約束;

2.4@JsonFormat功能演示

pojo層

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String username;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GTM+8")
    private Date birthday;
}

controller層

@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {

    @GetMapping("/exception")
    public User dft1(@RequestBody String userMsg) {
        ObjectMapper objectMapper = new ObjectMapper();
        User user = null;
        try {
            user = objectMapper.readValue(userMsg, User.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        log.info("用戶信息是:" + user);
        return user;
    }
}

測試結果:

image-20221101144019882

? 響應的JSON字符串數據如下:

? 可以發(fā)現(xiàn)@JsonFormat注解可以根據pattern屬性對返回的數據進行約束

image-20221101144945540

3.總結

當處理的數據格式為非JSON格式(url路徑傳參、Form-Data)的時候適合使用@DateTimeFormat注解進行處理,就是格式化后的日期格式并不會按照屬性pattern中所約束的格式響應,如果想要規(guī)定日期格式,可采用SimpleDateFormat對象進行處理。

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = simpleDateFormat.format(user.getBirthday());
System.out.println(date);

image-20221101151701854

當處理的數據格式為JSON數據格式時適合使用@JsonFormat注解進行處理,在這之前需要使用@RequestBody注解獲取請求體中的JSON字符串,再通過JSON解析庫將JSON字符串轉換為對應的POJO類型?;蛘呤菑臄祿熘胁槌鰧腄ateTime類型時對類型進行轉換。

 

到此這篇關于Java中@DateTimeFormat和@JsonFormat注解介紹的文章就介紹到這了,更多相關@DateTimeFormat和@JsonFormat注解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot中使用rabbitt的詳細方法

    springboot中使用rabbitt的詳細方法

    這篇文章主要介紹了springboot中使用rabbitt,通過本文學習讓我們了解如何在Spring Boot中使用RabbitMQ,并使用不同的交換機和隊列類型以及消息確認模式,需要的朋友可以參考下
    2023-05-05
  • springboot實現(xiàn)敏感字段加密存儲解密顯示功能

    springboot實現(xiàn)敏感字段加密存儲解密顯示功能

    這篇文章主要介紹了springboot實現(xiàn)敏感字段加密存儲,解密顯示,通過mybatis,自定義注解+AOP切面,Base64加解密方式實現(xiàn)功能,本文通過代碼實現(xiàn)給大家介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • Java并發(fā)LinkedBlockingQueue源碼分析

    Java并發(fā)LinkedBlockingQueue源碼分析

    這篇文章主要為大家介紹了Java并發(fā)LinkedBlockingQueue源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java 高并發(fā)的三種實現(xiàn)案例詳解

    Java 高并發(fā)的三種實現(xiàn)案例詳解

    這篇文章主要介紹了Java 高并發(fā)的三種實現(xiàn)案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • Springboot升級到2.7.2結合nacos遇到的坑及解決

    Springboot升級到2.7.2結合nacos遇到的坑及解決

    這篇文章主要介紹了Springboot升級到2.7.2結合nacos遇到的坑及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java Scala數據類型與變量常量及類和對象超詳細講解

    Java Scala數據類型與變量常量及類和對象超詳細講解

    本文內容主要分為3節(jié),依次講解:Scala的數據類型有哪些? 變量常量如何使用? 類和對象如何理解? 受限于博主的大腦容量,大概是無法做到事無巨細的,不過其實也沒必要那么"細",抓住主要脈絡,加上大量的練習,融會貫通只不過是時間的問題
    2022-12-12
  • IDEA報錯:java?找不到符號圖文解決過程

    IDEA報錯:java?找不到符號圖文解決過程

    這篇文章主要給大家介紹了關于IDEA報錯:java?找不到符號解決的相關資料,運行項目時Idea報錯,提示找不到符號,但是這個類在項目里是存在的,網上找了很多文章都沒解決,浪費了一個下午終于弄好了,記錄一下,需要的朋友可以參考下
    2023-08-08
  • Swagger-boostrap-ui如何配置用戶名密碼訪問

    Swagger-boostrap-ui如何配置用戶名密碼訪問

    這篇文章主要介紹了Swagger-boostrap-ui如何配置用戶名密碼訪問,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 深入學習java內存化和函數式協(xié)同

    深入學習java內存化和函數式協(xié)同

    這篇文章主要介紹了深入學習java內存化和函數式協(xié)同,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • Java 配置log 將日志信息輸出到指定日志文件中

    Java 配置log 將日志信息輸出到指定日志文件中

    這篇文章主要介紹了Java 配置log 將日志信息輸出到指定日志文件中,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

滁州市| 井冈山市| 洮南市| 定日县| 孟村| 南部县| 屯昌县| 尤溪县| 巫溪县| 承德县| 新乐市| 西充县| 涟水县| 商丘市| 河池市| 龙井市| 吴忠市| 新密市| 崇信县| 勐海县| 安顺市| 库尔勒市| 河北区| 慈溪市| 渝中区| 长海县| 贵定县| 张家口市| 密山市| 蕉岭县| 文化| 罗平县| 临漳县| 治多县| 德阳市| 广水市| 辛集市| 清涧县| 阿合奇县| 靖边县| 团风县|