正如here和here解释的那样,很清楚如何做到但仍然无法使其发挥作用。 我只想使用@Value注释来为spring bean注入一个属性。我用一个控制器和一个bean创建了一个基本的spring MVC项目。
这是我的申请背景:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<context:component-scan base-package="me.co.fatsecret" />
<!-- Properties -->
<bean id="props"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:fatProperties.properties" />
</bean>
</beans>
我有一个名为Configuration的bean:
package me.co.fatsecret;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Configuration {
/*--- Members ---*/
@Value("${api_key}")
protected String API_KEY;
@Value("${api_secret}")
protected String API_SECRET;
@Value("${api_url}")
protected String API_URL;
/*--- Constructors ---*/
public Configuration() {
}
/*--- Getters & Setters ---*/
public String getAPI_KEY() {
return API_KEY;
}
public void setAPI_KEY(String aPI_KEY) {
API_KEY = aPI_KEY;
}
public String getAPI_SECRET() {
return API_SECRET;
}
public void setAPI_SECRET(String aPI_SECRET) {
API_SECRET = aPI_SECRET;
}
public String getAPI_URL() {
return API_URL;
}
public void setAPI_URL(String aPI_URL) {
API_URL = aPI_URL;
}
}
现在我只有一个控制器,注入了这个Configuration类,当我调用这个控制器时,我看到Configuration类中的值没有正确填充。
我的属性文件位于resources文件夹(src / main / resources)下,是我的类路径的一部分(默认情况下已完成,因为这是一个maven项目)。这是:
api_url=http://platform.fatsecret.com/js?
api_key=SomeKey
api_secret=SomeSecret
文件名是fatProperties.properties。 当我在调用控制器时调试我的服务器时,我看到Configuration类的内容是:
${api_key}
${api_secret}
${api_url}
这是字符串的实际值,这意味着属性文件中的值不会因某种原因被注入。
我在这里错过了什么吗?
UPDATE1:我将PropertyPlaceholderConfigurer bean替换为:
<context:property-placeholder location="classpath:fatProperties.properties"/>
获得相同的结果
答案 0 :(得分:4)
好的,明白了!
我正在使用spring MVC项目,这意味着我的Web层(控制器)有一个独立的上下文。使用@Value注释对属性进行处理的“Configuration”bean将注入控制器。我的属性占位符是在我的根上下文中定义的,因此无法从我的控制器中看到它。为了解决这个问题,我只是将属性占位符定义添加到我的DispatcherServlet上下文中,它就像一个魅力:)
答案 1 :(得分:3)
将其添加到您的应用程序上下文文件中:
<context:property-placeholder location="classpath:fatProperties.properties" />
答案 2 :(得分:1)
尝试
@Value("#{props['api_key']}")
private String apiKey;