ConfigurationProperties将属性名称与yaml文件中的数字绑定

时间:2018-07-25 19:11:38

标签: java spring spring-boot yaml

我是Spring-Boot的新手,在将application.yml文件中的属性值绑定到以@ConfigurationProperies注释的类时遇到问题。

在application.yml中:

aaa:
  what-1word-is: true

在带有@ConfigurationProperties注释的类中:

@Data
@Configuration
@ConfigurationProperties(prefix = "aaa")
public class Test
{
    private boolean what1WordIs;
}

我尝试使用该属性的其他名称, 但是它们都不起作用; what1WordIs始终为false。 我试过的名字 what-1-word-iswhat-1word-iswhat1-word-iswhat-1Word-is。 仅what1-word-is有效(将配置类中的what1WordIs设置为true

Spring可以将名称中带有数字的属性绑定吗?

3 个答案:

答案 0 :(得分:1)

我将提出与要求不同的建议。我可能建议在属性文件中不允许数字。

如果可能,您可能会尝试将属性名称设置为如下所示:

aaa: what-single-word-is

或者更短一些:

aaa: single-word

Can't read yaml's complex object using @ConfigurationProperties. Integer cannot be cast to String

答案 1 :(得分:1)

应该可以。 我已经尝试过了,并且对我有用。即使是“ 1个单词是什么”。

application.yml

aaa:
  what-1-word-is: true

Config.class

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
@ConfigurationProperties(prefix = "aaa")
@Data
public class Config {
  private boolean what1WordIs;

  @PostConstruct
  public void init(){
      System.out.println("CONFIG :: "+this);
  }
}

结果我们可以看到:

CONFIG :: Config(what1WordIs=true)

我认为您遇到了这个问题,因为您使用@Configuration注释而不是@Component。

BTW:Spring允许我们在配置文件中使用不同的属性名称。我已经尝试了您提到的所有选项,并且可以使用。 (更多:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-relaxed-binding

BTW2:如果要查看spring期望的属性,可以添加以下内容:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

它将在描述所有属性的spring-configuration-metadata.json目录中生成/target/classes/META-INF。 示例:

{
  "groups": [
    {
      "name": "aaa",
      "type": "com.supra89kren.test_spring.configurtion.Config",
      "sourceType": "com.supra89kren.test_spring.configurtion.Config"
    }
  ],
  "properties": [
    {
      "name": "aaa.what1-word-is",
      "type": "java.lang.Boolean",
      "sourceType": "com.supra89kren.test_spring.configurtion.Config",
      "defaultValue": false
    }
  ],
  "hints": []
}

此外,IDE将能够为您自动完成:)

BTW3:请检查是否使用了来自lombok库的@Data。

我希望它仍然是现实的:)

答案 2 :(得分:0)

免责声明
这不是您要寻找的答案, 但这可能是解决该问题的方法。

关于我的一切
我不喜欢@ConfigurationProperties绑定技术 (您正在使用的)。 为了我, 似乎“太神奇了”。 代替, 我更喜欢在每个属性上使用@Value注释。

试试看
尝试在what1WordIs字段上使用以下注释:

@Value("${aaa.what-1word-is}")
private boolean what1WordIs;