How to correctly specify a default value in the Spring @Value annotation?
Initially, I have the following spec:
@Value("#{props.isFPL}")
private boolean isFPL=false;
This works fine correctly getting the value from the property file:
isFPL = true
However, the following expression with default results in the error:
@Value("#{props.isFPL:false}")
private boolean isFPL=false;
Expression parsing failed; nested exception is org.springframework.expression.spel.SpelParseException: EL1041E:(pos 28): After parsing a valid expression, there is still more data in the expression: 'colon(:)'
I also tried to use $ instead of #.
@Value("${props.isFPL:true}")
private boolean isFPL=false;
Then the default value in annotation works fine but I did not get the correct value from the Properties file:
Try with $
as follows:
@Value("${props.isFPL:true}")
private boolean isFPL=false;
Also make sure you set the ignore-resource-no-found
to true so that if the property file is missing, the default value will be taken.
Place the following in the context file if using XML based configuration:
<context:property-placeholder ignore-resource-not-found="true"/>
If using Java configurations:
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer();
p.setIgnoreResourceNotFound(true);
return p;
}
For int
type variable:
@Value("${my.int.config: #{100}}")
int myIntConfig;
Note: there is no space before the colon, but an extra space after the colon.
Does your Spring application context file contains more than one propertyPlaceholder beans like below:
<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true" location="classpath*:/*.local.properties" />
<context:property-placeholder location="classpath:/config.properties" />
If so, then property lookup for: props.isFPL will only take place for the first property file (.local.properties), if property not found, the default value (true) will take effect and the second property file (config.properties) is effectively ignored for this property.
For a String you can default to null like so:
public UrlTester(@Value("${testUrl:}") String url) {
this.url = url;
}