是否可以通过星号来定义一个@Value属性?

65 浏览
0 Comments

是否可以通过星号来定义一个@Value属性?

例如:\n

@Value("${a*}")
private Map complexMap;

\n以及在我的application.yml文件中:\na*:\n \"a\": \"a\"\n \"b\": \"b\"\n \"c\": \"c\"\n\n我得到了Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder \'a*\' in value \"${a*}\"错误。

0
0 Comments

从上面的内容可以看出,问题的出现原因是在使用@Value注解时,如果属性的key中包含星号(*)字符,会导致无法正确读取该属性的值。解决方法是使用@ConfigurationProperties注解来读取多个属性,对于需要读取Map类型的属性,可以在一个类上使用@ConfigurationProperties注解,并将其字段绑定到一组属性上。下面是一个示例:

首先,@Value注解用于绑定单个属性,但是如果该属性的key中包含星号字符,仍然可以正确读取。

例如:我们可以使用@Value注解来读取属性key为test*: hello的值。

@Value("${test1*}")

String greet; //hello

需要注意的是,要读取多个属性,应该使用@ConfigurationProperties注解。在你的情况下,要读取一个Map类型的属性,可以在一个类上使用@ConfigurationProperties注解,并将其字段绑定到一组属性上。无论该属性是否包含星号字符,@Value注解都不能正确使用来绑定Map类型的属性。

即使包含星号字符,也可以正确读取Map类型的属性。

示例:

application.yaml文件中的配置:

test:

comp*:

a: a

b: b

MapProperties.java文件中的代码:

@ConfigurationProperties(prefix = "test")

public class MapProperties {

Map comp;

public Map getComp() {

return comp;

}

public void setComp(Map comp) {

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

0