【问题标题】:Using accessors in Spring Boot JavaBean properties binding在 Spring Boot JavaBean 属性绑定中使用访问器
【发布时间】:2020-11-10 18:56:54
【问题描述】:

我正在使用@ConfigurationProperties 将属性绑定到 Spring Boot 项目中的 Java bean,如下所示:(示例取自 Spring 文档)

@ConfigurationProperties("acme")
public class AcmeProperties {

    private boolean enabled;

    private InetAddress remoteAddress;

    private final Security security = new Security();

    public boolean isEnabled() { ... }

    public void setEnabled(boolean enabled) { ... }

    public InetAddress getRemoteAddress() { ... }

    public void setRemoteAddress(InetAddress remoteAddress) { ... }

但在Spring Boot Docs 中有一个警告

映射到 Spring Boot 中可用的 @ConfigurationProperties 类的属性(通过属性文件、YAML 文件、环境变量等进行配置)是公共 API,但类本身的访问器(getter/setter)并不意味着可以直接使用。

我有点不明白这意味着什么。这是否是说我应该创建实例字段public 而不是使用AcmeProperties bean 中的getter(即getRemoteAddress())?我不明白为什么直接访问字段与通过 getter 访问会有所不同。很多tutorials 的字段为private

或者这个警告是指别的什么?

提前致谢!

【问题讨论】:

  • 你不应该只使用设置器,但是设置器是绑定工作所必需的(因为它需要一个可写的属性)。将字段公开将无济于事(字段不是 Java Beans 规范意义上的属性)。我认为该声明令人困惑,并没有真正澄清事情。
  • @M.Deinum 所以这个警告只针对 setter 而不是 getter?虽然它特别提到了getters...
  • 是的,我知道,但我怀疑它仅适用于设置器,因为绑定工作需要这些设置器。您需要使用 getter 来获取值,因此不使用 getter 不是一种选择,因为这也会违背类型安全配置类的使用。
  • @M.Deinum 是的,这让我感到困惑。除了公开违反 Bean 规范的字段之外,不确定如何在没有 getter 的情况下使用它。除非警告发生在其他事情上。

标签: java spring spring-boot


【解决方案1】:

本文档专门引用了带有 @ConfigurationProperties 注释的内部 Spring Boot 类。我同意文档令人困惑,但是您可以从以下 Spring Boot GitHub 问题 cmets 中看到此文档的意图:

  • 无论问题如何,请不要从我们的@ConfigurationProperties 扩展,尤其是具有相同的前缀。
  • 注释处理器需要有源代码才能提取默认值和文档等内容。通过扩展编译上下文之外的类,您将无法获得一致的元数据集(更糟糕的是它们会在您的示例中重复)。

https://github.com/spring-projects/spring-boot/issues/10713#issuecomment-338193282

我只是想知道扩展官方的@ConfigurationProperties 是否是一个有效的用例。

它不是(实际上是那个或任何其他@ConfigurationProperties bean)。让我在文档中澄清这一点。

https://github.com/spring-projects/spring-boot/issues/10713#issuecomment-338198921

我们已经记录了 @ConfigurationProperties 不是 #16704 中的公共 API,因此包括从它们扩展而来。查看当前文档,我认为没有必要添加更明确的内容。

https://github.com/spring-projects/spring-boot/issues/10713#issuecomment-533154033

GitHub 问题 #16704 导致提交添加此文档的 47a9bb1

总之,使用自定义 @ConfigurationProperties 类的 getter/setter 是没问题的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2018-10-15
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2019-11-24
    相关资源
    最近更新 更多