title: how to use Spring-EL in @Value when using constants to resolve a property
body: <p>I'm trying to use a constant to define a property and then resolving it with the @Value annotation.</p>
  
  <p>I defined the constant in an interface:</p>
  
  <pre><code>public interface InternalConstant{
     public static final String JOB_NAME_PROPERTY = "javabatch.jobName";
  }
  </code></pre>
  
  <p>I'm using springboot and I'm adding the property as a default property to the context:</p>
  
  <pre><code>SpringApplication springApp = new SpringApplication(configs.toArray());
  Properties props = new Properties();
  props.setProperty(InternalConstants.JOB_NAME_PROPERTY, "MyStartableJob");
  springApp.setDefaultProperties(props);
  </code></pre>
  
  <p>Now, I'd like to use @Value to inject the String "MyStartableJob" into a String.
  But instead of directly using <code>@Value(value="${javabatch.jobName})</code>, I'd like to use the defined constant.</p>
  
  <p>I tried</p>
  
  <pre><code>@Value(value="#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}")
  </code></pre>
  
  <p>But of course, this resolves only to "javabatch.jobName" and not to the value of the property named "javabatch.jobName".</p>
  
  <p>So I tried to wrap it in <code>@Value(value="${#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}}")</code>, but this causes an exception.</p>
  
  <pre><code>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
  </code></pre>
  
  <p>I know, that I could simply inject the Environment and using its getProperty method:</p>
  
  <pre><code>@Autowired
  private Environment env;
  
  public void m1() {
      env.getProperty(InternalConstants.JOB_NAME_PROPERTY);
  }
  </code></pre>
  
  <p>This works and serves my purpose.
  But I wonder, if this could also be done using SPEL in @Value.</p>
  
  <p>Thanks.</p>