之前我曾经在其他项目中工作,我只是重新做同样的事情,但由于某种原因,它不起作用。 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}
它不会解析为属性文件中的值。
思想?
答案 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 file 和Spring 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 有时可能需要一天或半天才能解决;)
这是我所做的:
将属性添加到属性或 YAML 文件
确保使用 @EnableAutoConfiguration 或 @SpringBootApplication 注释主类
创建可以在其中使用 @Value 的 AppConfig
@Value("${PROPERTY}") 私有字符串 URL;
在类级别使用 @Configuration 注释此 AppConfig
示例:在某些服务中@Autowired private AppConfig appConfig; 并在此服务的方法中调用 appConfig.getUrl() 以从属性文件中获取属性 URL 的值。
注意:不要试图在服务构造函数中获取值,它会为空。
答案 10 :(得分:0)
我的原因是导入了错误的 dependency
。
我无意中从 lombok
而不是 "import org.springframework.beans.factory.annotation.Value;"
导入了它
改回来解决了问题