【问题标题】:@ConfigurationProperties and unresolvable properties@ConfigurationProperties 和不可解析的属性
【发布时间】:2017-03-06 17:01:03
【问题描述】:

假设如下配置bean:

@ConfigurationProperties(prefix="foo")
private class FooProperties {
   private String mystring;
   private int myint;
}

还有以下application.properties

foo.mystring = ${bar.mystring}
foo.myint    = ${bar.myint}

请注意,这两个属性无法解析,因为没有定义以 bar 开头的属性。以下是将会发生的事情:

  • foo.mystring 设置为字符串"${bar.mystring}"(无分辨率)
  • foo.myint 将导致转换错误,因为字符串 "${bar.myint}" 无法转换为有效整数。

我希望在这种情况下会引发一种 Unresolvable Property 异常。就像我使用 @Value("${foo.mystring}") 会发生什么一样。

这是预期的行为吗? 在这种情况下,有没有办法让 SpringBoot 抛出这样的异常?

【问题讨论】:

    标签: java spring spring-boot properties


    【解决方案1】:

    相反,我希望出现一种 Unresolvable Property 异常 在这种情况下抛出。

    foo.myint 没有抛出Unresolvable Property exception,因为它正在使用${bar.myint} 解决,而当Spring 尝试将String 类型转换为int 作为您存储在Properties 文件中的所有内容时,它在下一步失败是一个字符串值,除非你明确指定它的类型,如:

    foo.myint = (java.lang.Integer)${bar.myint}
    

    这是预期的行为吗?

    可能是的。

    有没有办法让SpringBoot在这种情况下抛出这样的异常?

    是的,对于Global 级别,您可以使用@ControllerAdvice,如果您想在Controller 级别拥有它,那么您可以使用@ExceptionHandler

    【讨论】:

    • 同意您关于 int 属性的看法。但是,您提出的解决方案似乎适用于网络绑定的东西。我关心的是属性绑定到使用@ConfigurationProperties 注释的类。
    猜你喜欢
    • 2017-06-02
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2017-10-19
    • 1970-01-01
    • 2017-10-08
    • 2016-03-16
    相关资源
    最近更新 更多