java 如何在Spring @Value annotation中正确指定默认值?

avkwfej4  于 2023-05-27  发布在  Java
关注(0)|答案(8)|浏览(157)

最初,我有以下规范:

@Value("#{props.isFPL}")
private boolean isFPL=false;

这样可以正确地从属性文件中获取值:

isFPL = true

但是,以下表达式使用默认值会导致错误:

@Value("#{props.isFPL:false}")
private boolean isFPL=false;

表达式解析失败;嵌套异常为org.springframework.expression.spel.SpelParseException:EL 1041 E:(位置28):解析一个有效的表达式后,表达式中还有更多的数据:'colon(:)'

我也试着用$代替#。

@Value("${props.isFPL:true}")
private boolean isFPL=false;

然后注解中的默认值可以正常工作,但我没有从Properties文件中获得正确的值:

gojuced7

gojuced71#

尝试使用$,如下所示:

@Value("${props.isFPL:true}")
private boolean isFPL=false;

还要确保将ignore-resource-no-found设置为 true,这样如果属性文件丢失,将采用 default 值。
如果使用基于XML的配置,请将以下内容放入上下文文件中:

<context:property-placeholder ignore-resource-not-found="true"/>

如果使用Java配置:

@Bean
 public static PropertySourcesPlaceholderConfigurer   propertySourcesPlaceholderConfigurer() {
     PropertySourcesPlaceholderConfigurer p =  new PropertySourcesPlaceholderConfigurer();
     p.setIgnoreResourceNotFound(true);

    return p;
 }
f8rj6qna

f8rj6qna2#

对于int类型变量:

@Value("${my.int.config: #{100}}")
int myIntConfig;

**注意:**冒号前 * 没有空格,冒号后 * 有额外空格。

gzjq41n4

gzjq41n43#

问题的确切答案取决于参数的***类型***。
对于'String'参数,您的示例代码工作正常:

@Value("#{props.string.fpl:test}")
private String fpl = "test";

对于其他类型(比如你的问题中的boolean),应该这样写:

@Value("${props.boolean.isFPL:#{false}}")
private boolean isFPL = false;

或对于“整数”:

@Value("${props.integer.fpl:#{20}}")
4szc88ey

4szc88ey4#

您的Spring应用程序上下文文件是否包含多个propertyPlaceholder beans,如下所示:

<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true" location="classpath*:/*.local.properties" />
<context:property-placeholder location="classpath:/config.properties" />

如果是,则属性查找:props.isFPL 只会在第一个属性文件(.local.properties)中发生,如果未找到属性,则默认值(true)将生效,第二个属性文件(config.properties)将被有效忽略。

s5a0g9ez

s5a0g9ez5#

对于String,你可以像这样默认为null:

public UrlTester(@Value("${testUrl:}") String url) {
    this.url = url;
}
qgzx9mmu

qgzx9mmu6#

这取决于您如何加载属性,如果您使用类似
<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />
那么@Value应该是这样的

@Value("${isFPL:true}")
roejwanj

roejwanj7#

如果默认值是字符串,则按如下方式指定:

@Value("${my.string.config: #{'Default config value'}}")
String myIntConfig;
6ovsh4lw

6ovsh4lw8#

这种定义默认值的方式只有在@Value注解中写入“value=...”时才有效。例如

不工作:@Value(“${testUrl:some-url}”//无论您在配置文件中做什么,都会始终设置“some-url”。
Works:@Value(value =“${testUrl:some-url}”//仅当配置文件中缺少testUrl属性时,才会设置“some-url”。

相关问题