簡體   English   中英

從 YAML 屬性文件(Java 和 Spring Boot)實例化 POJO(LocalDateTime)

[英]Instantiating POJO (LocalDateTime) from YAML Properties File (Java & Spring Boot)

我正在嘗試使用 Spring Boot 在初始化時從 YAML 屬性文件加載自定義屬性。 我找到了無數關於如何做到這一點的教程,而且它們很有效。 問題是我似乎找不到如何實例化 POJOS 的方法,例如 LocalDateTime。 我的代碼如下所示。

@Configuration
@ConfigurationProperties(prefix="default-film-showings")
public class FilmShowings {
    private List<FilmShowing> filmShowings;

    //Constructors, Getters, setters etc.

    public static class FilmShowing {
        private Integer id;
        private Film film;
        private Theatre theatre;
        private LocalDateTime dateTime;

        //Constructors, Getters, setters etc.
    }
}

我的YAML文件目前如下

default-film-showings:
  filmShowings:
    - id: 1
      dateTime: 2018-07-13 21:00:00

我的問題是初始化時出現以下錯誤

Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDateTime' for property 'filmShowings[0].dateTime';

我也試過這個變體

default-film-showings:
  filmShowings:
    - id: 1
      dateTime:
        date: 
          year: 2018
          month: 7
          day: 13
        time:
          hour: 21
          minute: 0
          second: 0
          nano: 0

但我收到以下錯誤

Error creating bean with name 'filmShowings': Could not bind properties to FilmShowings

有什么幫助嗎? 在 Spring Boot 中查看了以下線程 JSON Java 8 LocalDateTime 格式,但它沒有解決我的問題。

同樣,有沒有辦法將 Film POJO 屬性鏈接到另一個默認屬性?

假設我的屬性文件中有以下內容

default-films:
  films:
    - id: 1
      filmName: Spider-Man

我也可以添加這樣的東西嗎?

default-film-showings:
  filmShowings:
    - id: 1
      film: default-films.films[0]
      dateTime: whatever I need to do here to make it work

它將 default-films.films[0] 讀取為字符串,因此不匹配“YAML”對象。

有什么幫助嗎?

  1. 假設 Spring 支持@ConfigurationProperties類中的@DateTimeFormat批注(我尚未驗證),您已將格式聲明為DateTimeFormat.ISO.DATE_TIME ,即2011-12-03T10:15:30+01:00[Europe/Paris] 您的屬性文件有2018-07-13 21:00:00這不是任何標准格式。 你期望它如何工作?

  2. 您的數據類型是LocalDateTime ,它沒有時區概念,因此與ISO_DATE_TIME格式相矛盾。 但是,ISO_DATE_TIME 的時區是可選的,因此這可能不是問題。

顯然,您是在往牆上扔意大利面條,希望有什么東西能粘住。 編寫單元測試並嘗試將字符串轉換為您想要的任何日期時間對象。 完成后,如果遇到問題,請回來。

您應該只調整配置類中的設置器。

如果你的 yaml 是:

default-film-showings:
  filmShowings:
    - id: 1
      dateTime: 2018-07-13 21:00:00

然后在您的配置類中執行此操作:

@Configuration
@ConfigurationProperties(prefix="default-film-showings")
public class FilmShowings {
    private List<FilmShowing> filmShowings;

    //Constructors, Getters, setters etc.

    public static class FilmShowing {
        private Integer id;
        private Film film;
        private Theatre theatre;
        private LocalDateTime dateTime;

        //Constructors, Getters, setters etc.
        public void setDateTime(String dateTime) {
          DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 
          HH:mm:ss");
          LocalDateTime formatDateTime = LocalDateTime.parse(dateTime, formatter);
          this.dateTime= formatDateTime;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM