我有一个Spring bean定义文件,如下所示
<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。
因为我试图将过滤器创建为上下文处理程序的(子)属性,所以上下文尚未初始化并且因此没有Spring WAC似乎是明智的。
我想知道的是如何在Spring本身正在组装的嵌入式Jetty容器中配置Spring Security?
似乎有一个捕获22场景只需要一个较晚的初始化,但我找不到合适的旗帜来旋转。我已经尝试将lazy-init="true"
设置到过滤器bean上,但这似乎没有达到太多,不足为奇。
相关: How to embed Jetty into Spring and make it use the same AppContext it was embedded into?
答案 0 :(得分:0)
我正在运行Jetty 6.1.4和Spring 3.0.5,但我是用老式的方式,使用WEB-INF / web.xml。
采用这种方法,它会造成零问题。
public class JettyServer {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.load(new FileInputStream("./etc/server.properties"));
Server server = new Server();
final String configFile = props.getProperty("server.config");
XmlConfiguration configuration =
new XmlConfiguration(new File(configFile).toURI().toURL());
configuration.configure(server);
HandlerCollection handlers = new HandlerCollection();
WebAppContext webapp = new WebAppContext();
webapp.setContextPath(props.getProperty("context.path"));
webapp.setDefaultsDescriptor(props.getProperty("default.config"));
webapp.setWar(props.getProperty("war.path"));
NCSARequestLog requestLog = new NCSARequestLog(props.getProperty("log.file"));
requestLog.setExtended(true);
RequestLogHandler requestLogHandler = new RequestLogHandler();
requestLogHandler.setRequestLog(requestLog);
handlers.setHandlers(
new Handler[] { webapp, new DefaultHandler(), requestLogHandler });
server.setHandler(handlers);
server.setStopAtShutdown(true);
server.setSendServerVersion(true);
server.start();
server.join();
}