Spring Injection无法在资源文件中找到变量

时间:2012-10-16 08:05:02

标签: spring configuration resource-files

我在项目中创建了一个资源文件。我想将资源文件中的值注入spring bean。我在applicacationContext.xml中定义了资源文件的占位符。

<context:property-placeholder  location="file:///${MRAPOR_PROPPATH}mRapor.properties" />

我可以将值注入到applicationContext.xml中声明的bean,如:

<bean
        id="dataSource"
        class="org.springframework.jndi.JndiObjectFactoryBean" >

        <property
            name="jndiName"
            value="${database.jndiName}" />

        <property
            name="lookupOnStartup"
            value="false" />

        <property
            name="cache"
            value="true" />

        <property
            name="proxyInterface"
            value="javax.sql.DataSource" />
    </bean>

这很有效。但是,如果我使用spring注释声明bean,我就无法注入值。

@Component("SecurityFilter")
public class SecurityFilter implements Filter {
    public static final String USER = "USER_SESSION_KEY";
    public static final String CENTRIFY_USERNAME_KEY = "REMOTE_USERNAME";

    @Value("${url.logout}")//I get error here !!!!
    private String logoutUrl;
    //proper setters and  getters.
}

您是否知道为什么我无法访问使用注释声明的bean内的值。

这是我的例外

weblogic.application.ModuleException: 
    at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1510)
    at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:482)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
    at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
    Truncated. see log file for complete stacktrace
Caused By: java.lang.IllegalArgumentException: Could not resolve placeholder 'url.logout' in string value [${url.logout}]
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:173)
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:125)
    at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer$PlaceholderResolvingStringValueResolver.resolveStringValue(PropertyPlaceholderConfigurer.java:255)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:748)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:745)

2 个答案:

答案 0 :(得分:0)

@Value由java编译器处理,而XML由Spring Bean处理器解析 - 这是两个非常不同的东西......为什么你认为它应该以相同的方式工作?

编辑:我读了它,似乎实际上可以使用Spring EL,你只需要用#代替$

private @Value( "#{application.url.logout}" ) String logoutUrl;

干杯,

答案 1 :(得分:0)

您确定实际过滤请求的SecurityFilter实例是由Spring管理的吗?

默认情况下,Filter中声明的web.xml由servlet容器实例化,因此它们不受Spring和Spring管理,例如@Value将无法在其中工作。

但是,Spring为您的用例提供了特殊支持 - 您可以使用DelegatingFilterProxy将过滤委托给由Spring管理的组件。在web.xml中声明如下:

<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>...</filter-mapping>

DelegatingFilterProxy会将请求过滤委托给名为SecurityFilter的bean(如@Component中所述)。