【问题标题】:Instantiating POJO (LocalDateTime) from YAML Properties File (Java & Spring Boot)从 YAML 属性文件(Java 和 Spring Boot)实例化 POJO(LocalDateTime)
【发布时间】:2017-12-12 19:15:25
【问题描述】:

我正在尝试在使用 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

有什么帮助吗?我查看了以下线程JSON Java 8 LocalDateTime format in Spring Boot,但它并没有解决我的问题。

类似地,有没有办法将 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”对象。

有什么帮助吗?

【问题讨论】:

  • 如果您尝试使用 ISO 格式的字符串会发生什么。示例2007-03-01T13:00:00 ?
  • 嗨。谢谢您的回答。我目前有类似@DateTimeFormat(pattern = "yyyy-MM-ss HH:mm:dd", iso= DateTimeFormat.ISO.DATE_TIME) private LocalDateTime dateTime; 的东西,我在 YAML 中输入了dateTime: "2007-03-01T13:00:00"。得到以下错误Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDateTime'

标签: java spring properties yaml pojo


【解决方案1】:

你应该只修改配置类中的设置器。

如果你的 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;
        }
    }
}

【讨论】:

    【解决方案2】:
      1234563您的属性文件有2018-07-13 21:00:00,它不是任何标准格式。您希望它如何工作?
    1. 您的数据类型是LocalDateTime,它没有时区的概念,因此与ISO_DATE_TIME 格式相矛盾。但是,时区对于 ISO_DATE_TIME 是可选的,因此这可能不是问题。

    很明显,你是在往墙上扔意大利面,希望有什么东西能粘住。编写一个单元测试并尝试将字符串转换为您想要的任何日期时间对象。完成后,如果有问题,请回来。

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 1970-01-01
      • 2018-10-27
      • 2017-08-18
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多