2015-06-02 91 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; 
相關問題