使用常量解析属性时如何在@Value 中使用Spring-EL [英] how to use Spring-EL in @Value when using constants to resolve a property

查看:31
本文介绍了使用常量解析属性时如何在@Value 中使用Spring-EL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用常量来定义属性,然后使用 @Value 注释解析它.

I'm trying to use a constant to define a property and then resolving it with the @Value annotation.

我在接口中定义了常量:

I defined the constant in an interface:

public interface InternalConstant{
   public static final String JOB_NAME_PROPERTY = "javabatch.jobName";
}

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

I'm using springboot and I'm adding the property as a default property to the context:

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}),我想使用定义的常量.

Now, I'd like to use @Value to inject the String "MyStartableJob" into a String. But instead of directly using @Value(value="${javabatch.jobName}), I'd like to use the defined constant.

我试过了

@Value(value="#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}")

当然,这仅解析为javabatch.jobName",而不解析为名为javabatch.jobName"的属性的值.

But of course, this resolves only to "javabatch.jobName" and not to the value of the property named "javabatch.jobName".

所以我试图将它包装在 @Value(value="${#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}}") 中,但是这个导致异常.

So I tried to wrap it in @Value(value="${#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}}"), but this causes an exception.

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 方法:

I know, that I could simply inject the Environment and using its getProperty method:

@Autowired
private Environment env;

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

这有效并符合我的目的.但我想知道,这是否也可以在 @Value 中使用 SPEL 来完成.

This works and serves my purpose. But I wonder, if this could also be done using SPEL in @Value.

谢谢.

推荐答案

最简单的方法呢:

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

这篇关于使用常量解析属性时如何在@Value 中使用Spring-EL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆