所以我還沒有發現過基於從上面ericacm一個更好的答案。更好的唯一原因是您仍然可以使用<load-on-startup>
作爲web.xml文件中的servlet。
嵌入Jetty服務器時,需要創建WebAppContext
。超類ContextHandler
可讓您設置EventListener
的數組,其中包括ServletContextListener
。
所以解決方案擴展爲ContextLoader
並實現了Spring的ApplicationContextAware
和ServletContextListener
接口。加載器可讓您返回由contextaware界面設置的父上下文,並且偵聽器通過contextInitialized()
爲您提供ServletContext
。
然後,您可以在任何Jetty組件之前對其進行初始化,並在Jetty服務器加載時訪問完全填充的ServletContext
,在初始化任何Web應用程序之前調用該服務器。
監聽器實現:
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(最終由服務器所引用):
<!-- 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>
您仍然需要不在web.xml中聲明ContextLoaderListener,因爲嵌入式實現需要在父上下文中聲明。由於您沒有調用ContextLoaderListener,因此您仍然需要在web.xml中設置contextConfigLocation context-param。 –