0

私の Camel (2.14.0) アプリケーションでは、Spring Web Services を使用して Camel ルートをトリガーします。アーティファクトは OSGi バンドルとしてビルドされ、Karaf (3.0.2) にデプロイされます。

最初のバージョンでは、JVM 内部 Web サーバーを使用しorg.springframework.remoting.support.SimpleHttpServerFactoryBeanて Web サービスを公開するように spring-ws を構成しました。これはうまくいきます。しかし、あまり OSGi 風ではありません。org.springframework.ws.transport.http.MessageDispatcherServlet代わりに、次のようにサービスとしてKaraf ホワイトボード エクステンダーに公開したいと思います。

<bean id="pas-ws-patient-servlet" class="org.springframework.ws.transport.http.MessageDispatcherServlet">
    <property name="contextConfigLocation" value="/endpoint-mapping.xml" /> 
</bean>

<osgi:service ref="pas-ws-patient-servlet" interface="javax.servlet.http.HttpServlet">
    <service-properties>
        <entry key="alias" value="/${pas.ws.patient.contextroot}" />
    </service-properties>
</osgi:service>

これは、「通常の」サーブレットの魅力のように機能します。しかし、MessageDispatcherServletは独自のものを構築したいと考えており、そのコンテキストWebApplicationContextでタイプの Bean を見つけることを期待しています。org.springframework.ws.server.EndpointMappingCamel は、EndpointMappingその spring-ws コンポーネントで使用する必要がある の実装を提供します。

私が直面している問題は、エンドポイント マッピング Bean の同じインスタンスをOsgiBundleXmlApplicationContext、Camel コンテキストを作成する と によって作成されたアプリケーション コンテキストの間で共有する必要があることMessageDispatcherServletです。OsgiBundleXmlApplicationContextmyが の親である場合は、これが当てはまりますWebApplicationContext。の親コンテキストをWebApplicationContext、サーブレットをサービスとして公開している「現在の」コンテキストに設定する方法はわかりません。

WebApplicationContext内からインスタンスOsgiBundleXmlApplicationContext化して MessageDispatcherServlet に渡すと、例外が発生します。

java.lang.IllegalArgumentException: Cannot resolve ServletContextResource without ServletContext

残念ながら、 のWebServiceMessageReceiver( をカプセル化するEndpointMapping) はMessageDispatcherServletプライベート メンバーです。したがって、マッピング Bean を単純な方法で設定することはできません。

コンテキスト階層を作成する方法はありますか? または、Bean インスタンスを別の方法でコンテキスト間で共有できますか?

4

1 に答える 1