是否可以通过星号来定义一个@Value属性?
从上面的内容可以看出,问题的出现原因是在使用@Value注解时,如果属性的key中包含星号(*)字符,会导致无法正确读取该属性的值。解决方法是使用@ConfigurationProperties注解来读取多个属性,对于需要读取Map类型的属性,可以在一个类上使用@ConfigurationProperties注解,并将其字段绑定到一组属性上。下面是一个示例:
首先,@Value注解用于绑定单个属性,但是如果该属性的key中包含星号字符,仍然可以正确读取。
例如:我们可以使用@Value注解来读取属性key为test*: hello的值。
@Value("${test1*}")
String greet; //hello
需要注意的是,要读取多个属性,应该使用@ConfigurationProperties注解。在你的情况下,要读取一个Map
即使包含星号字符,也可以正确读取Map
示例:
application.yaml文件中的配置:
test:
comp*:
a: a
b: b
MapProperties.java文件中的代码:
@ConfigurationProperties(prefix = "test")
public class MapProperties {
Map
public Map
return comp;
}
public void setComp(Map
this.comp = comp;
}
}
在上面的示例中,comp*属性被绑定到MapProperties类中的comp字段上。
现在,您可以在任何需要的地方自动装配这个MapProperties类。
MapProperties mapProperties;
您可以通过调用其getter方法来获取属性值,如下所示:
mapProperties.getComp()
需要注意的是,如果没有指定前缀(在我们的示例中是test),是无法正常工作的。没有前缀的情况下,我们必须像这样指定(value= "comp*")。
否则会抛出错误:
Configuration property name 'comp*' is not valid:
Invalid characters: '*'
Bean: mapProperties
Reason: Canonical names should be kebab-case ('-' separated), lowercase alpha-numeric characters and must start with a letter