首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用常量解析属性时在@Value中使用Spring-EL

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

Stack Overflow用户
提问于 2015-06-02 20:12:12
回答 2查看 11.3K关注 0票数 9

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

我在接口中定义了常量:

代码语言:javascript
复制
public interface InternalConstant{
   public static final String JOB_NAME_PROPERTY = "javabatch.jobName";
}

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

代码语言:javascript
复制
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}),而是使用定义的常量。

我试过了

代码语言:javascript
复制
@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}}")中,但这导致了一个异常。

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
@Autowired
private Environment env;

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

这是可行的,也是我的目的。但是我想知道,在@Value中使用SPEL是否也可以做到这一点。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-02 21:48:03

那最简单的方法呢:

代码语言:javascript
复制
@Value("${" + InternalConstant.JOB_NAME_PROPERTY + "}")
private String jobName
票数 22
EN

Stack Overflow用户

发布于 2015-06-02 20:37:04

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

代码语言:javascript
复制
@Value("#{environment.getProperty(T(com.example.InternalConstants).JOB_NAME_PROPERTY)}")
private String jobName;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30595757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档