JSF Managed Beans不使用spring安全过滤器

时间:2014-01-14 08:26:03

标签: jsf-2 dependency-injection spring-security

我在jsf spring应用程序中偶然发现了一个问题。 在成功设置之后,我将spring安全性添加到我的应用程序中,并且突然在jsf bean中注入@ManagedProperty停止工作。更具体地说,当使用它们时,这样注入的属性为空。

我正在使用jsf 2.1,spring 3.1(core + security)

配置如下所示:  的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <welcome-file-list>
    <welcome-file>index.jsf</welcome-file>
  </welcome-file-list>

   <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
   </listener>

  <listener>
    <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
  </listener>
  <listener>
    <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
  </listener>

  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
  </context-param>

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

     <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
     </filter-mapping>

      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-security-context.xml</param-value>
      </context-param>

</web-app>

FacesServlet是默认的servlet调度程序。

在面部配置中我添加了

<application>
        <el-resolver>
                org.springframework.web.jsf.el.SpringBeanFacesELResolver
        </el-resolver>
    </application>

...

jsf托管bean看起来像这样:

@ManagedBean
public class InterviewForm {

    @ManagedProperty (value="#{springInterviewHelper}")
    private SpringInterviewHelper springInterviewHelper;

...

springInterviewHelper使用web.xml中添加的springSecurityFilterChain结束null。如果我删除该过滤器一切正常,除了我无法利用弹簧安全的事实:)。通过调试进行检查,堆栈跟踪中的唯一修改与安全过滤相关,因此可能导致注入失败。 我想使用jsf注释而不是spring的注释,因为我可以使用@ViewScoped和jsf托管bean的其他舒适的东西。这可能吗?什么可能导致注射失败?

非常感谢, 的Marius

1 个答案:

答案 0 :(得分:1)

默认情况下,ContextLoaderListener从WEB-INF目录中加载名为applicationContext.xml的xml文件。只要您指定名为 contextConfigLocation context-param,此默认值就不再适用。另请参阅reference guide

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-security-context.xml</param-value>
</context-param>

上面的配置将导致加载 ONLY 上述配置文件,它将不再加载applicationContext.xml文件。现在,只需将上述文件添加到param-value标记即可轻松解决此问题。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/spring-security-context.xml</param-value>
</context-param>

这应该可以解决问题。