2015-06-02 58 views
2

我试图使用常量来定义一个属性,然后使用@Value注释解决它。如何在@Value中使用Spring-EL时使用常量来解析属性

我所定义的恒定在一个接口:

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); 

现在,我d喜欢使用@Value将字符串“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 

我知道,我可以简单地注入环境和使用其getProperty方法:

@Autowired 
private Environment env; 

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

这个工作和我的服务宗旨。 但我想知道,如果这也可以在@Value中使用SPEL来完成。

谢谢。

+0

显示堆栈跟踪请。 – Jens

+0

@Jens:为了简单起见,我添加了堆栈跟踪 –

回答

7

什么最简单的方法:

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

+1。这个解决方案还具有额外的好处,即重命名重构不会在不太智能的IDE中破坏你的代码:)。 –

+0

但它不会进入一个类常量,用于例如缓存组名称等其他注释中的例子... –

3

您可以直接在规划环境地政司表示访问使用environment通过不断引用的属性和正确的值应注射:

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