Spring @Value没有解析为属性文件中的值

时间:2013-04-10 22:26:29

标签: java spring spring-properties

之前我曾经在其他项目中工作,我只是重新做同样的事情,但由于某种原因,它不起作用。 Spring @Value不是从属性文件中读取,而是从字面上取值

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

在我的控制器中,我有:

@Autowired
private AppConfig appConfig;

应用程序启动很好,但是当我这样做时

appConfig.getValue()

它返回

${key.value1}

它不会解析为属性文件中的值。

思想?

11 个答案:

答案 0 :(得分:52)

我还发现@value无效的原因是@value需要PropertySourcesPlaceholderConfigurer而不是PropertyPlaceholderConfigurer。我做了相同的更改,它对我有用,我使用的是Spring 4.0.3版本。 我在配置文件中使用以下代码配置了它 -

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

答案 1 :(得分:16)

问题是由于我的applicationContext.xml与spring-servlet.xml中的问题 - 它是bean之间的范围问题。

pedjaradenkovic向我指出了一个现有的资源: Spring @Value annotation in @Controller class not evaluating to value inside properties fileSpring 3.0.5 doesn't evaluate @Value annotation from properties

答案 2 :(得分:10)

在我的情况下,不会注入静态字段。

答案 3 :(得分:2)

我使用的是春季启动,而且我将版本从1.4.0.RELEASE升级到1.5.6.RELEASE解决了这个问题。

答案 4 :(得分:2)

对于Sprig-boot用户,PropertyPlaceholderConfigurer和Spring 3.1中添加的新PropertySourcesPlaceholderConfigurer。所以它可以直接访问属性文件。刚注入

注意:确保您的媒体资源不是Static

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

答案 5 :(得分:1)

阅读pedjaradenkovic的评论。

除了他提供的链接之外,其不起作用的原因是@Value处理需要PropertySourcesPlaceholderConfigurer而不是PropertyPlaceholderConfigurer

答案 6 :(得分:1)

在我的情况下,我错过了花括号。我有@Value("foo.bar") String value而不是正确的格式@Value("${foo.bar}") String value

答案 7 :(得分:1)

请注意,如果整个代码库中有多个application.properties文件,请尝试将值添加到父级项目的属性文件中。

您可以检查项目的pom.xml文件,以识别当前项目的父项目是什么。

或者,尝试使用environment.getProperty()代替@Value

答案 8 :(得分:0)

就我而言,我有 lombok @AllArgsConstructor 并且它也获取了该属性。删除此注释解决了问题。

答案 9 :(得分:0)

@Value 有时可能需要一天或半天才能解决;)

这是我所做的:

  1. 将属性添加到属性或 YAML 文件

  2. 确保使用 @EnableAutoConfiguration 或 @SpringBootApplication 注释主类

  3. 创建可以在其中使用 @Value 的 AppConfig

    @Value("${PROPERTY}") 私有字符串 URL;

在类级别使用 @Configuration 注释此 AppConfig

  1. 到目前为止设置已经完成,您可以通过自动装配 AppConfig 随时随地使用它

示例:在某些服务中@Autowired private AppConfig appConfig; 并在此服务的方法中调用 appConfig.getUrl() 以从属性文件中获取属性 URL 的值。

注意:不要试图在服务构造函数中获取值,它会为空。

答案 10 :(得分:0)

我的原因是导入了错误的 dependency。 我无意中从 lombok 而不是 "import org.springframework.beans.factory.annotation.Value;" 导入了它 改回来解决了问题