Как использовать Spring-EL в @Value при использовании констант для разрешения свойства

Я пытаюсь использовать константу, чтобы определить свойство, а затем разрешить его с помощью аннотации @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$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);
}

Это работает и служит моей цели. Но мне интересно, можно ли это сделать с помощью SPEL в @Value.

Благодарю.

2 ответа

Решение

Как насчет простейшего подхода:

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

Вы можете получить доступ к свойству, указанному константой, используя environment непосредственно в выражении SpEL и правильное значение должно быть введено:

@Value("#{environment.getProperty(T(com.example.InternalConstants).JOB_NAME_PROPERTY)}")
private String jobName;
Другие вопросы по тегам