Opentravel Alliance スキーマの非常に大きな (900 以上のクラス) セットから生成されたオブジェクトの JAXB データバインディングを使用する JAX-WS サービスを作成しようとしています。
Web メソッドが参照しない限り、さまざまなサーブレット コンテナー (Jetty、Tomcat6/7 など) に JAX-WS サービスを含む war (適切な web.xml および sun-jaxws.xml を使用) を正常に展開できます。私のJAXBオブジェクトのいずれか。たとえば、これは機能します:
@WebService(serviceName = "OTAService",
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@Addressing
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public class OTAService {
public String sayHello(final String name) {
return "Hello " + name + "!";
}
}
ただし、注釈を追加するか、オブジェクトを直接参照することにより、JAXB データバインディングを使用するように Web メソッドを変更すると、@XmlSeeAlso
試したすべてのサーブレットコンテナーが無期限に (1 時間以上) エラーなしでハングし、開始されません。
@WebService(serviceName = "OTAService",
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@Addressing
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({OTAHotelResNotifRQ.class, OTAHotelResNotifRS.class})
public class OTAService {
@Action(input = "OTA_HotelResNotif")
@WebMethod(operationName = "OTA_HotelResNotif", action = "OTA_HotelResNotif")
public @WebResult OTAHotelResNotifRQ tokenizeOtaHotelResNotifRq(
@WebParam(partName = "OTA_HotelResNotifRQ", name = "OTA_HotelResNotifRQ",
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
final OTAHotelResNotifRQ request) {
return request;
}
}
JAXB および JAX-WS API とランタイム jar を含む必要なすべての jar が war の /lib ディレクトリに存在することを確認しました。
私の JAX-WS プロジェクトに必要な依存関係である私の JAXB オブジェクトを含む jar は、このプロジェクトmvn clean install
で実行することによって作成し、ローカル リポジトリにインストールできます。
ここで入手できる私の JAX-WS プロジェクトは、 を呼び出すことで Jetty で実行できますmvn clean package jetty:run-war
。
sayHello
単純なメソッドのみが存在する場合、Jetty がすぐに起動することに気付くでしょう。ただし、JAXB メソッドのコメントを外すと、JAX-WS サーブレットをインスタンス化しようとしているときに、Jetty および私が試した他のすべてのサーブレット コンテナーが永久にハングします。 JAXB データバインディングを使用した Web メソッドが私の戦争の展開を妨げる理由を誰かが説明できますか? フリーズ動作はさまざまなサーブレット コンテナーで同じであるため、見逃している重要なステップがあるに違いないと感じています。ただし、エラーは報告されず、コンテナーの起動がハングアップするだけなので、続行する方法がわかりません。