74

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

AppConfig.java

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

    public String getValue()
    {
        return value;
    }
}

应用程序上下文.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}

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

想法?

4

11 回答 11

71

我还发现@value不起作用的原因是,@value需要PropertySourcesPlaceholderConfigurer而不是PropertyPlaceholderConfigurer. 我做了同样的改变,它对我有用,我使用的是 spring 4.0.3 版本。我在我的配置文件中使用以下代码进行了配置-

@Bean 
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
于 2014-11-27T06:47:31.003 回答
34

就我而言,不会注入静态字段。

于 2017-03-30T08:42:51.417 回答
19

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

pedjaradenkovic 好心地向我指出了一个现有资源: @Controller 类中的 Spring @Value 注释不评估属性文件中的值, 并且Spring 3.0.5 不评估属性中的 @Value 注释

于 2013-04-14T04:35:02.883 回答
13

就我而言,我错过了花括号。我有@Value("foo.bar") String value而不是正确的形式@Value("${foo.bar}") String value

于 2018-06-08T00:59:20.440 回答
8

对于 Sprig-boot 用户,PropertyPlaceholderConfigurer 和 Spring 3.1 中添加的新 PropertySourcesPlaceholderConfigurer。所以访问属性文件很简单。只需注入

注意:确保您的财产不得 Static

@Value("${key.value1}")
private String value;
于 2018-04-12T13:12:07.757 回答
4

我使用的是spring boot,对我来说升级版本1.4.0.RELEASE解决1.5.6.RELEASE了这个问题。

于 2017-09-09T12:50:55.363 回答
2

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

于 2021-04-20T12:26:38.717 回答
2

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

这是我所做的:

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

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

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

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

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

  1. 到目前为止,设置已完成,现在可以通过自动装配 AppConfig 在任何您想要的地方使用它

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

注意:不要试图在 CONSTRUCTOR OF SERVICE 中获取价值,它将为空。

于 2021-05-15T06:58:55.307 回答
1

阅读 pedjaradenkovic 的评论。

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

于 2013-04-10T22:33:51.547 回答
0

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

于 2021-08-07T14:38:50.613 回答
0

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

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

或者,尝试使用environment.getProperty()而不是@Value.

于 2020-04-27T15:57:44.477 回答