【问题标题】:Is there a clean way to extract nested properties from an application.properties using @ConfigurationProperties?有没有一种干净的方法可以使用 @ConfigurationProperties 从 application.properties 中提取嵌套属性?
【发布时间】:2021-02-18 06:58:51
【问题描述】:

我希望从 @Value 注释转移到使用 @ConfigurationProperties 主要是因为我最终拥有太多属性,因此将所有属性添加到目标类中似乎会使带有值注释的类变得混乱,如果我要将它们标记为 final,那么构造函数将有一个很长的参数列表。

application.properties

sms-gateway:
  sms:
    authorization:
      token: xyz
    username: abc
    password: pass
    url: http://example.com
    lynx:
      cmd: lynx -dump -display_charset=utf-8 <%= @sms-gateway_sms_url %>
    via:
      cmd: true
  admin:
    status:
      url: http://admin.example.com/status

SmsService.java

...

@Value("${sms-gateway.sms.url}")
private String url;

@Value("${sms-gateway.sms.username}")
private String username;

@Value("${sms-gateway.sms.password}")
private String password;

and so on ...

作为替代@ConfigurationProperties 允许您拥有一个将属性组合在一起的专用类。但是,您最终将其绑定到一个公共命名空间,以便属性与使用 @ConfigurationProperties 注释的类的字段绑定。

SmsConfig.java

...

@Getter
@RequiredArgsConstructor
@Configuration
@ConfigurationProperties(prefix = "sms-gateway.sms")
public class SmsConfig.java {
  
  private final String username;
  private final String password;
  private final String url;
  ...
}

但是,要添加其他嵌套属性,您需要为每个嵌套属性添加类以及 @NestedConfigurationProperty 以表明这是一个嵌套属性。如果有许多嵌套属性,这可能会再次失控。

我的问题有两个——

  1. 有没有一种更简洁的方法来实现这一点,而不必涉及内部类并将嵌套属性绑定到同一个公共命名空间中的一个字段下。 例如在上面的示例中 - 我们如何绑定授权令牌或 lynx 命令属性,而无需添加单个字段内部或全新的类。

  2. 有没有办法更改字段名称并将它们绑定到属性名称,所以如果我想要一个不同的名称 private final String SmsGatewayUsername 并将其绑定到用户名属性?

感谢您提供任何 cmets 和答案!

【问题讨论】:

    标签: java spring spring-boot properties spring-properties


    【解决方案1】:
    1. 不,您不能更改结构。但是,如果您不介意丢失 bean 类型,您可以绑定 Map&lt;String, Object&gt;

    2. 属性由 bean 属性绑定,这些属性由公共 getter 和 setter 确定,而不是字段名称。你可以添加一个你喜欢的任何名字的setter,里面有你想要的任何逻辑。要变得非常复杂,您可以编写一个自定义 bean 属性绑定器,但我不建议将它用于您的用例。默认的会做一些事情,比如将 kebab-case 转换为 camelCase。

    您的属性名称和配置类都应该遵循逻辑结构,如果它们是相同的结构,则处理起来会容易得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 2011-07-28
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      相关资源
      最近更新 更多