Eri*_*son 4 java spring spring-el
使用 SpEL 的 Spring @Value 注释有一个有趣的问题。设置 null 的默认值适用于 String 变量。但是,对于 Set 变量则不然。
所以,这是有效的(varStr 为空):
@Value("${var.string:#{NULL}}")
private String varStr;
Run Code Online (Sandbox Code Playgroud)
而这不是(varSet 现在包含一个带有“#{NULL}”的元素):
@Value("#{'${var.set:#{NULL}}'.split(',')}")
private Set<String> varSet;
Run Code Online (Sandbox Code Playgroud)
问题是如何使其与 Set 变量一起工作,以便默认情况下将其设置为 null。
对你的帮助表示感谢。
您可以尝试将 注入@Value到数组而不是 Set 中。然后在@PostConstructinit 块中将其转换为所需的 Set 实例。当不存在此类属性时,Spring 似乎正在注入一个空数组(非 null)(注意@Value字符串中的空默认值)。当它确实存在时,它默认以逗号分隔。
像这样:
@Value("${some.prop:}")
private String[] propsArr;
private Set<String> props;
@PostConstruct
private void init() throws Exception {
props = (propsArr.length == 0) ? null : Sets.newHashSet(propsArr);
}
Run Code Online (Sandbox Code Playgroud)
我只会提出另一个建议。我建议你根本不要使用null,而是使用一个空的 Set 来代替。Null 往往容易出错,并且通常不会传达比空集合更多的信息。您的情况可能会有所不同 - 这只是一般性建议。
顺便说一句 - 该Sets.newHashSet(...)调用来自Google 的 Guava 库。强烈推荐。
您可以创建一个 PropertySourcesPlaceholderConfigurer。该 bean 将拦截属性源值并允许您配置它们。
@Configuration
@ComponentScan
class ApplicationConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
c.setNullValue("");
return c;
}
Run Code Online (Sandbox Code Playgroud)
参考:http ://blog.codeleak.pl/2015/09/placeholders-support-in-value.html
这会将空字符串默认为 null。
| 归档时间: |
|
| 查看次数: |
8650 次 |
| 最近记录: |