2012-10-16 41 views
1

我的项目中创建了一个资源文件。我想从资源文件中注入值到spring bean中。我在applicacationContext.xml中定义了资源文件的占位符。弹簧注入在资源文件中找不到变量

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

我可以注入值,这是宣布在applicationContext.xml如豆类:

<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) 

回答

0

@Value由Java编译器,而该XML被Spring Bean的处理器解析处理 - 这是两个完全不同的事情...为什么你认为应该工作以相同的方式?

编辑:我读了它,它似乎使用Spring EL实际上是不可能的,你只能有#,而不是$前缀:

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

干杯,

+0

我知道区别。不过,我已经在应用程序上下文中声明了我的资源文件。你知道任何方式通过@Value注释注入它吗? – erencan

+0

看我的编辑和参考。 Spring表达语言:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/new-in-3.html#new-feature-el –

+0

不幸的是。 ı得到“找不到字段或属性”错误。 Spring试图在上下文中注入一些bean。然而,application.url.logout不是一个spring bean。 – erencan

0

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

默认情况下,在web.xml宣布Filter S被servlet容器实例化,因此它们不会被春春的注解管理如@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豆(在你@Component)。

+0

是的,我有一个委托过滤器条目,你在我的web.xml中建议。所以我的安全过滤器由Spring管理。 – erencan