Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有一种干净的方法可以使用@ConfigurationProperties从application.properties提取嵌套属性?_Java_Spring_Spring Boot_Properties_Spring Properties - Fatal编程技术网

Java 是否有一种干净的方法可以使用@ConfigurationProperties从application.properties提取嵌套属性?

Java 是否有一种干净的方法可以使用@ConfigurationProperties从application.properties提取嵌套属性?,java,spring,spring-boot,properties,spring-properties,Java,Spring,Spring Boot,Properties,Spring Properties,我希望从@Value注释转移到使用@ConfigurationProperties主要是因为我最终拥有了太多的属性,所以在目标类中添加所有属性似乎会使类中的值注释变得混乱,如果我将它们标记为final,那么构造函数将有一个很长的属性列表参数 application.properties sms-gateway: sms: authorization: token: xyz username: abc password: pass url: http

我希望从
@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

另外,
@ConfigurationProperties
允许您拥有一个将属性分组在一起的专用类。但是,您最终将它绑定到一个公共名称空间,以便属性与使用
@ConfigurationProperties
注释的类的字段绑定

SmsConfig.java

。。。
@吸气剂
@所需参数构造函数
@配置
@配置属性(前缀=“sms网关.sms”)
公共类SmsConfig.java{
私有最终字符串用户名;
私有最终字符串密码;
私有最终字符串url;
...
}
但是,要添加其他嵌套属性,您需要为每个嵌套属性添加类以及
@NestedConfigurationProperty
,以指示这是一个嵌套属性。如果存在许多嵌套属性,这可能再次有点失控

我的问题有两个方面-

  • 有没有更干净的方法来实现这一点,而不必涉及内部类和绑定同一公共名称空间中字段下的嵌套属性。 例如,在上面的示例中,我们如何绑定授权令牌或lynx命令属性,而不必添加单个字段或全新的类

  • 有没有办法更改字段名并将其绑定到属性名,比如说我是否需要不同的名称
    私有最终字符串SmsGatewayUsername
    ,并希望将其绑定到username属性

  • 非常感谢您的评论和回答

  • 不,您不能更改结构。但是,如果您不介意丢失bean类型,可以绑定
    映射

  • 属性由bean属性绑定,bean属性由公共getter和setter而不是字段名决定。您可以添加一个setter,该setter具有您喜欢的任何名称,并且具有您想要的任何逻辑。要变得非常复杂,您可以编写一个定制的bean属性绑定器,但我不建议将其用于您的用例。默认情况下,会将烤肉串转换为camelCase

  • 属性名和配置类都应该遵循逻辑结构,如果它们是相同的结构,那么处理起来就容易多了