繁体   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