使用常量解析 属性 时如何在 @Value 中使用 Spring-EL
how to use Spring-EL in @Value when using constants to resolve a property
我正在尝试使用常量来定义一个 属性,然后使用 @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="#{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.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 来完成。
谢谢。
您可以直接在 SpEL 表达式中使用 environment
访问常量引用的 属性 并且应该注入正确的值:
@Value("#{environment.getProperty(T(com.example.InternalConstants).JOB_NAME_PROPERTY)}")
private String jobName;
最简单的方法是什么:
@Value("${" + InternalConstant.JOB_NAME_PROPERTY + "}")
private String jobName
我正在尝试使用常量来定义一个 属性,然后使用 @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="#{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.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 来完成。
谢谢。
您可以直接在 SpEL 表达式中使用 environment
访问常量引用的 属性 并且应该注入正确的值:
@Value("#{environment.getProperty(T(com.example.InternalConstants).JOB_NAME_PROPERTY)}")
private String jobName;
最简单的方法是什么:
@Value("${" + InternalConstant.JOB_NAME_PROPERTY + "}")
private String jobName