私は既存のSpring Webアプリケーションの中で作業しています。 WSDLを提供するSOAP Webサービスを呼び出すコードを記述する必要があります。私はNetbeansも使用していますが、それが簡単なときはいつでもコマンドラインに飛びついていきます。WSDLとcodehaus jaxb2を使用するSpring Soap Webサービスクライアント。 XmlRootElementが必要ですか?
私は、プロジェクト用のMaven pomをcodehaus jaxb2-maven-pluginをインクルードするように設定し、小さなテストプログラムを書いてリクエストを送信しました。その呼び出しが実行されると、XmlRootElementアノテーションがないため、生成されたクラスの1つを処理できないというエラーが表示されます。
さらにそのエラーを検索すると、情報の要求は大量にありますが、該当するものはありません。それらのほとんどは、別のJaxBライブラリを使用しています。それらのすべてが、私が持っているプラグインではなく、プラグインの設定方法の例を私に教えてくれます。
私はプラグインを変更することができますが(私は既に一度持っていますが)、私は本当にこのようなドキュメントを見つけることが大好きです。私は、Java 7ではなく、8ではなく、Spring 4(または5、または6)に関わらず、mavenプラグインおよび/またはコマンドラインに提供できるさまざまなオプションについての説明が必要ですクラスを生成して、目的のためにSpringのデフォルトクラスによって整列化および非整列化することができます。
---編集
ここに私の瞬間があります。それは代わりの構成で、私はちょうどマーシャラーが宣言され、コードで設定したテストコードなので:
public class XClient extends WebServiceGatewaySupport {
public GetXResponse getXResponse(GetX XRequest) {
// do in configuration for production...
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.X.pics.service");
setMarshaller(marshaller);
setUnmarshaller(marshaller);
String uri = "https://site.X.com/services/X";
WebServiceTemplate template = getWebServiceTemplate();
Object response = template.marshalSendAndReceive(uri,
XRequest
);
GetXResponse getXResponse = (GetXResponse) response;
return getXResponse;
}
}
私は私のプログラムを実行すると、それは以下の(ちょうど最初の行)を与える:
org.springframework.oxm.MarshallingFailureException: JAXB marshalling exception; nested exception is javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "com.xo.pics.service.GetPricing" as an element because it is missing an @XmlRootElement annotation]
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:237)
at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:322)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:483)
私は、Springのライブラリの方が好きです.SOの多くの答えが "このツール/ライブラリへの切り替え"の形を取っているように思えます。私は、春にマーシャラーを構成し、使用することを喜んで覚えています。
これは、WSDLのxsdファイルの構造と関係があるプラグインを構成する方法とは関係ありません。ルート要素が決定できないように構造化されている場合、追加されません。要求を作成して送信するために使用しているコードは何ですか?(あなたはSpring WSまたは少なくともそのプロジェクトの「WebServiceTemplate」を使用していると仮定します)。 –
WSDLにcomplexType要素が含まれていて、それが宣言された名前を持っていれば、他の場所で参照される可能性があり、したがってルート要素の注釈を持たないと読んでいます。また、一部のJAXB実装では、要素が他の場所で参照されていないこと、指定されたwsdl/XSDのセットがすべて存在することを示す構成要素を入力できることも読んでいます。これは具体的には、このサービスへのリクエストをマーシャリングするために、生成されたクラスを使用したいと思います。私はそれを行うために春のライブラリに固執することを好むだろう。 – arcy
そして、なぜ春の別のbeanの設定を追加するのが春のライブラリを使わないのですか?あなたのXMLに 'Jaxb2Marshaller'を設定して、それを(un)マーシャリングのために使用してください...プラグインの設定と生成されたコードを手動で(あるいはそうでない)混乱させる必要はありません。 –