私の 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.EndpointMapping
Camel は、EndpointMapping
その spring-ws コンポーネントで使用する必要がある の実装を提供します。
私が直面している問題は、エンドポイント マッピング Bean の同じインスタンスをOsgiBundleXmlApplicationContext
、Camel コンテキストを作成する と によって作成されたアプリケーション コンテキストの間で共有する必要があることMessageDispatcherServlet
です。OsgiBundleXmlApplicationContext
myが の親である場合は、これが当てはまりますWebApplicationContext
。の親コンテキストをWebApplicationContext
、サーブレットをサービスとして公開している「現在の」コンテキストに設定する方法はわかりません。
WebApplicationContext
内からインスタンスOsgiBundleXmlApplicationContext
化して MessageDispatcherServlet に渡すと、例外が発生します。
java.lang.IllegalArgumentException: Cannot resolve ServletContextResource without ServletContext
残念ながら、 のWebServiceMessageReceiver
( をカプセル化するEndpointMapping
) はMessageDispatcherServlet
プライベート メンバーです。したがって、マッピング Bean を単純な方法で設定することはできません。
コンテキスト階層を作成する方法はありますか? または、Bean インスタンスを別の方法でコンテキスト間で共有できますか?