我有一个Spring bean的定义文件,如下配置Spring Security嵌入码头春季
<bean id="jettyZk" class="org.eclipse.jetty.server.Server" init-method="start" destroy-method="stop">
<!-- properties, threadPool, connectors -->
<property name="handler">
<bean class="org.eclipse.jetty.servlet.ServletContextHandler">
<property name="eventListeners">
<list>
<!-- my.ContextLoaderListener
* An ApplicationContextAware ContextLoaderListener that allows for using the current ApplicationContext,
* as determined by ApplicationContextAware, as the parent for the Root WebApplicationContext.
*
* Also provides for specifying the contextConfigLocation of the Root WebApplicationContext, because
* Eclipse Jetty 7 ServletContextHandler does not expose a setInitParameters method.
-->
<bean class="my.ContextLoaderListener">
<property name="contextConfigLocation" value="/META-INF/spring/applicationContext-securityZk.xml"/>
</bean>
<!-- not sure if this is needed, disabled for now -->
<!-- <bean class="org.springframework.web.context.request.RequestContextListener"/> -->
</list>
</property>
<property name="servletHandler">
<bean class="org.eclipse.jetty.servlet.ServletHandler">
<property name="filters">
<list>
<bean class="org.eclipse.jetty.servlet.FilterHolder">
<property name="name" value="springSecurityFilterChain"/>
<property name="filter">
<bean class="org.springframework.web.filter.DelegatingFilterProxy"/>
</property>
</bean>
</list>
</property>
<!-- filterMappings, servlets, servletMappings -->
</bean>
</property>
</bean>
</property>
</bean>
当试图启动的背景下,我得到下面的异常
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: ServletContext must not be null
Caused by: java.lang.IllegalArgumentException: ServletContext must not be null
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext(WebApplicationContextUtils.java:109)
这是使用Spring 3.0.5.RELEASE
这个异常是可以理解的,查看DelegatingFilterProxy#findWebApplicationContext的代码和JavaDocs,它说
WebApplicationContext是必须已加载并存储在 ServletContext中之前该过滤器被初始化(或调用)。
,因为我试图创建过滤器作为上下文句柄(子)属性,因此它似乎是合理的,上下文还没有被初始化,因此既没有春节WAC。
我想知道的是如何在Spring本身正在装配的嵌入式Jetty容器中配置Spring Security?
似乎有一个catch 22场景只需要一个较晚的初始化,但我找不到一个合适的标志来旋转。我已经尝试将lazy-init="true"
设置到过滤器bean上,但这似乎并没有实现太多,不出所料。
相关: How to embed Jetty into Spring and make it use the same AppContext it was embedded into?
作为试图解决这个问题,我一直在看春季JavaConfig的结果,有一个相关的问题:http://stackoverflow.com/questions/6683771/spring-configuration-and-contextcomponent-扫描 – ptomli
你有没有想过办法做到这一点?我基本上有同样的问题。 – tdimmig
我结束了基于@Configuration的设置 – ptomli