我在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
答案 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>
这应该可以解决问题。