Spring @Value is not resolving to value from property file

I've had this working in some other project before, I am just re-doing the same thing but for some reason it's not working. The Spring @Value is not reading from property file, but instead it's taking the value literally

AppConfig.java

@Component
public class AppConfig
{
@Value("${key.value1}")
private String value;


public String getValue()
{
return value;
}
}

applicationContext.xml:

<context:component-scan
base-package="com.test.config" />
<context:annotation-config />


<bean id="appConfigProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:appconfig.properties" />
</bean>

appconfig.properties

key.value1=test value 1

In my controller, where I have:

@Autowired
private AppConfig appConfig;

The application starts just fine, but when I do

appConfig.getValue()

it returns

${key.value1}

It doesn't resolve to the value inside the properties file.

Thoughts?

185065 次浏览

Have a read of pedjaradenkovic's comment.

Further to the link he provides, the reason this isn't working is that @Value processing requires a PropertySourcesPlaceholderConfigurer instead of a PropertyPlaceholderConfigurer.

Problem is due to problem in my applicationContext.xml vs spring-servlet.xml - it was scoping issue between the beans.

pedjaradenkovic kindly pointed me to an existing resource: Spring @Value annotation in @Controller class not evaluating to value inside properties file and Spring 3.0.5 doesn't evaluate @Value annotation from properties

I also found the reason @value was not working is, @value requires PropertySourcesPlaceholderConfigurer instead of a PropertyPlaceholderConfigurer. i did the same changes and it worked for me, i am using spring 4.0.3 release. I configured this using below code in my configuration file -

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}

In my case, static fields will not be injected.

I was using spring boot, and for me upgrading the version from 1.4.0.RELEASE to 1.5.6.RELEASE solved this issue.

for Sprig-boot User both PropertyPlaceholderConfigurer and the new PropertySourcesPlaceholderConfigurer added in Spring 3.1. so it's straightforward to access properties file. just inject

Note: Make sure your property must not be Static

@Value("${key.value1}")
private String value;

In my case I was missing the curly braces. I had @Value("foo.bar") String value instead of the correct form @Value("${foo.bar}") String value

In my case, I had the lombok @AllArgsConstructor and that picked up the property as well. Deleting this annotation solved the problem.

@Value sometimes can take a day or a half to get resolved ;).

Here is what I did :

  1. Add property to properties or YAML file

  2. Make Sure MAIN CLASS IS ANNOTATED WITH @EnableAutoConfiguration OR @SpringBootApplication

  3. CREATE AppConfig IN WHICH YOU CAN USE @Value

    @Value("${PROPERTY}") private String URL;

Annotate this AppConfig with @Configuration at class level

  1. SO FAR SETUP IS DONE NOW USE IT WHEREVER YOU WANT BY AUTOWIRING AppConfig

EXAMPLE: IN SOME SERVICE @Autowired private AppConfig appConfig; AND IN THE METHOD OF THIS SERVICE call appConfig.getUrl() to get the value of property URL from a properties file.

NOTE: DON'T TRY TO GET VALUE IN CONSTRUCTOR OF SERVICE IT WILL BE NULL.

Mine was casued by importing a wrong dependency. I had it imported from lombok by accident instead of "import org.springframework.beans.factory.annotation.Value;" Changing it back solved the problem

For me it was due to resources folder not marked as "Resources Root" in Intellij IDEA. Just right-click on resources directory -> "Mark directory as" -> "Resources Root".

The reason why things were not working for me was because I had 2 instances of PropertyPlaceholderConfigurer beans set up (in a large set of spring configurations). And once one is setup the other is completely useless. It is probably a very obvious thing, but for me it was not. I do not understand why a second instance of a PropertyPlaceholderConfigurer does not throw an exception at the moment of creation (when there is already another instance). Instead of silently ignoring the second instance. Like this you could get a meaningful error.

Hope it is helpful for anyone out there :.)