import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.ContextLoader;
public final class EmbeddedJettySpringContextLoaderListener
extends ContextLoader
implements ApplicationContextAware,
ServletContextListener
{
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* Returns the parent application context as set by the
* {@link ApplicationContextAware} interface.
*
* @return The initial ApplicationContext that loads the Jetty server.
*/
@Override
protected ApplicationContext loadParentContext(ServletContext servletContext) {
return this.applicationContext;
}
@Override
public void contextInitialized(ServletContextEvent sce) {
super.initWebApplicationContext(sce.getServletContext());
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//not needed
}
}
WebAppContext的Jetty配置(最终由服务器引用):
<!-- Loads this application context as the parent of the web application context. -->
<bean id="parentContextLoaderListener" class="com.citi.matrix.server.restapi.EmbeddedJettySpringContextLoaderListener" />
<bean id="restApiWebAppContext" class="org.mortbay.jetty.webapp.WebAppContext">
<property name="displayName" value="RestApi" />
<property name="contextPath" value="/" />
<!-- the value for war, must be a relative path to the root of the application, and does not use the classpath. -->
<property name="war" value="${WEBAPPS_HOME}/rest-api" />
<property name="eventListeners">
<ref local="parentContextLoaderListener" />
</property>
<property name="configurationClasses">
<list>
<value>org.mortbay.jetty.webapp.WebInfConfiguration</value>
<value>org.mortbay.jetty.webapp.WebXmlConfiguration</value>
<value>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</value>
</list>
</property>
<property name="logUrlOnStart" value="true" />
</bean>
2条答案
按热度按时间p3rjfoxz1#
我假设您在Jetty的web.xml中有一个
ContextLoaderListener
,这就是Spring Web上下文的创建方式。1.从jetty的web.xml中删除
ContextLoaderListener
(但保留context-param
和contextConfigLocation
)1.子类
ContextLoader
,覆盖loadParentContext()
以返回初始Spring上下文。1.在启动Jetty之后创建
ContextLoader
子类的示例。1.在此示例上调用
initWebApplicationContext(context.getServletContext().getContext())
,其中“context”是org.mortbay.jetty.servlet.Context
zc0qhyus2#
所以我在上面ericacm的基础上找到了一个更好的答案,唯一的原因是你仍然可以在web.xml文件中使用
<load-on-startup>
作为servlet。在嵌入Jetty服务器时,需要创建一个
WebAppContext
。超类ContextHandler
允许您设置一个包含ServletContextListener
的EventListener
数组。所以解决方案是扩展
ContextLoader
并实现Spring的ApplicationContextAware
和ServletContextListener
接口。loader允许您返回contextware接口设置的父上下文,而listener通过contextInitialized()
提供ServletContext
。然后,您可以在任何Jetty组件之前对其进行初始化,并在Jetty服务器加载时访问完全填充的
ServletContext
,该服务器在任何Web应用程序本身初始化之前被调用。监听器实现:
WebAppContext的Jetty配置(最终由服务器引用):