我正在尝试使用常量来定义属性,然后使用@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将字符串“ MyStartableJob”注入到字符串中。但是@Value(value="${javabatch.jobName}),我不想直接使用,而是使用定义的常量。
@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}}"),但这会导致异常。
@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完成此操作。
谢谢。
那么最简单的方法呢:
@Value("${" + InternalConstant.JOB_NAME_PROPERTY + "}") private String jobName