2011-09-16 1 views
2

私は春から起動するJettyの埋め込みインスタンス内でRESTサービスを起動するSpringアプリケーションを持っています。WebコンテキストからSpring非Webコンテキストを見つけることは可能ですか?

最初のSpringコンテキストは、統合とデータベースレイヤーを持ち、Jettyインスタンスを起動します。 Jettyは、RESTサービスを公開する独自のアプリケーションコンテキストファイルを呼び出します。

最初のSpringコンテキストをJetty内から実行されるWebコンテキストに公開する方法があるかどうかを知りたいと思います。残念ながら、私は完全なJ2EEサーバーをデプロイできません。Webコンテキストからすべてを実行することを躊躇しています。スレッドを管理するためにJettyに依存しています。

答えて

1

ある

  • コールこのインスタンス上のinitWebApplicationContext(context.getServletContext().getContext()) は、だから私はまだ上記ericacmから1オフに基づいて、より良い答えを見つけました。より良い唯一の理由は、web.xmlファイル内のサーブレットにはまだ<load-on-startup>を使用できることです。

    Jettyサーバーを組み込むときは、WebAppContextを作成する必要があります。スーパークラスContextHandlerでは、ServletContextListenerを含むEventListenerの配列を設定できます。

    したがって、ソリューションはContextLoaderに拡張され、SpringのApplicationContextAwareServletContextListenerの両方のインターフェイスを実装します。ローダを使用すると、コンテキストウェアインタフェースによって設定された親コンテキストを返すことができ、リスナはServletContextからcontextInitialized()を提供します。

    これをJettyコンポーネントの前に初期化し、Jettyサーバーがロードされるときに完全に埋め込まれたServletContextにアクセスすることができます。これは、Webアプリケーション自身が初期化される前に呼び出されます。

    リスナーの実装:WebAppContextため

    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 
        } 
    } 
    

    桟橋設定(最終的にはサーバーによって参照):

    <!-- 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> 
    
  • +0

    埋め込み実装を親コンテキストで宣言する必要があるため、web.xmlにContextLoaderListenerを宣言する必要はありません。 ContextLoaderListenerを呼び出さないので、web.xmlでcontextConfigLocation context-paramを設定する必要があります。 –

    3

    私はJettyのweb.xmlにContextLoaderListenerがあると仮定しており、これがSpringのWebコンテキストの作成方法です。

    1. あなたの最初の春のコンテキストを返すためにloadParentContext() をオーバーライドし、桟橋のweb.xmlからContextLoaderListener を取り外します(しかしcontextConfigLocationcontext-paramを保つ)

    2. サブクラスContextLoader

    3. Jettyの起動後、ContextLoader サブクラスのインスタンスを作成します。 「文脈」はorg.mortbay.jetty.servlet.Context

    +0

    は完全にこれを逃しました。私はそれを試してみるのに今は時間がありませんが、実際にそうすることに興奮しています。すぐに更新されます。ありがとう。 –

    +0

    これは動作しますが、いくつかの注意点があります。まず、contextPathを.getContext()メソッドに提供する必要があることです。2つ目は、起動時にデフォルトのサーブレット・コンテキストのルックアップが失敗するため、サーブレットをロードできないことです。 私の目的のために、それは大したことではありませんが、これは完璧に動作します。もし私ができるなら、私はこれを2回投票するだろう。 –

    関連する問題