在 java.util.Set 变量的 Spring @Value 中将默认值设置为 null

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。

对你的帮助表示感谢。

ped*_*rro 5

您可以尝试将 注入@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 库。强烈推荐。


wsc*_*tz4 3

您可以创建一个 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。