90

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?

ROMANIA_engineer
  • 54,432
  • 29
  • 203
  • 199
TS-
  • 4,311
  • 8
  • 40
  • 52
  • 6
    Duplicated http://stackoverflow.com/questions/11890544/spring-value-annotation-in-controller-class-not-evaluating-to-value-inside-pro and http://stackoverflow.com/questions/5275724/spring-3-0-5-doesnt-evaluate-value-annotation-from-properties – pedjaradenkovic Apr 10 '13 at 22:29
  • Thanks! didn't find that thread, most the ones I found was related to the value being NULL – TS- Apr 11 '13 at 12:55

15 Answers15

79

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();
}
Sachchidanand Singh
  • 1,456
  • 1
  • 15
  • 15
20

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

Community
  • 1
  • 1
TS-
  • 4,311
  • 8
  • 40
  • 52
17

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

Naruto Sempai
  • 6,233
  • 8
  • 35
  • 51
14

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;
Dapper Dan
  • 932
  • 11
  • 23
4

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

craastad
  • 6,222
  • 5
  • 32
  • 46
3

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

Ahmed Aziz
  • 380
  • 1
  • 5
  • 17
3

@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.

Dharman
  • 30,962
  • 25
  • 85
  • 135
Shirish Singh
  • 797
  • 7
  • 17
  • 1
    Thank you so much - that was my point 'NOTE: DON'T TRY TO GET VALUE IN CONSTRUCTOR OF SERVICE IT WILL BE NULL.' – Tony Feb 18 '22 at 14:41
1

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.

Muel
  • 4,309
  • 1
  • 23
  • 32
  • 1
    PropertyPlaceholderConfigurer works just fine for me. I just needed to fix the context:component-scan in my app context xml and spring servlet xml – TS- Apr 11 '13 at 12:56
  • @TS what version of spring are you using, please? – Muel Apr 11 '13 at 13:15
  • Can't you @Autowire Environment instead? see http://stackoverflow.com/a/15562319/632293 – jediz Apr 01 '16 at 16:08
0

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

Ole Pannier
  • 3,208
  • 9
  • 22
  • 33
emily
  • 45
  • 1
  • 9
0

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".

gmexo
  • 1,892
  • 2
  • 14
  • 19
0

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 :.)

marcel
  • 377
  • 2
  • 9
0

For me it was because I had moved my project root folder. I don't know why, but removing all folders .settings, .mvn, target, .project and reimport project into eclipse worked for me.

MatthieuBlm
  • 43
  • 1
  • 8
0

In my case, I did not care about where does this value is used! If it uses in constructor, take care about components' loading order!

0

This was a real case and still relevant for this question.

When you have a config server provided configuration, and it is running in CloudFoundry. You have to make sure that you have configured the permissions to access the git repository that holds the configuration files.

The weird thing in this case is that sometimes the value was being resolved and sometimes it did not.

The cloud config server deployed had 2 instances created. One of the instances was created when the github token was still valid and the other was created when the token was invalidated using manual scalation. So this second instance was not UP although the first instance continued UP and running.

The service depending on that config server was deployed with 3 instances. When the application was deployed it created 2 instances with the values correctly injected and 1 instance with values with null because it was trying to resolve the configuration properties from the config server instance that was not UP.

gersonZaragocin
  • 1,122
  • 12
  • 20
0

Don't repeat my mistake. If this occurrs during tests only make sure you put your value(s) in property file in /test/resources

Alexander
  • 15
  • 1
  • 4
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Aug 26 '23 at 12:15