使用常量解析属性时如何在@Value中使用Spring-EL

时间:2015-06-02 12:12:12

标签: spring spring-boot spring-el spring-environment

我尝试使用常量来定义属性,然后使用@Value注释解析它。

我在界面中定义了常量:

public interface InternalConstant{
   public static final String JOB_NAME_PROPERTY = "javabatch.jobName";
}

我使用springboot并且我将该属性作为默认属性添加到上下文中:

SpringApplication springApp = new SpringApplication(configs.toArray());
Properties props = new Properties();
props.setProperty(InternalConstants.JOB_NAME_PROPERTY, "MyStartableJob");
springApp.setDefaultProperties(props);

现在,我想使用@Value注入String" MyStartableJob"成为一个字符串。 但是,我不想直接使用@Value(value="${javabatch.jobName}),而是想使用已定义的常量。

我试过

@Value(value="#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}")

但当然,这只能解析为" javabatch.jobName"而不是名为" javabatch.jobName"的属性的值。

所以我尝试将其包装在@Value(value="${#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}}")中,但这会导致异常。

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder '#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}' in string value "${#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}}"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204)
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178)
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:175)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:801)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:955)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
    ... 16 more

我知道,我可以简单地注入Environment并使用其getProperty方法:

@Autowired
private Environment env;

public void m1() {
    env.getProperty(InternalConstants.JOB_NAME_PROPERTY);
}

这适用于我的目的。 但我想知道,如果这也可以在@Value中使用SPEL来完成。

感谢。

2 个答案:

答案 0 :(得分:12)

最简单的方法是什么:

@Value("${" + InternalConstant.JOB_NAME_PROPERTY + "}")
private String jobName

答案 1 :(得分:3)

您可以直接在SpEL表达式中使用environment访问常量引用的属性,并且应该注入正确的值:

@Value("#{environment.getProperty(T(com.example.InternalConstants).JOB_NAME_PROPERTY)}")
private String jobName;