2016-05-11 13 views
0

私は既存の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の多くの答えが "このツール/ライブラリへの切り替え"の形を取っているように思えます。私は、春にマーシャラーを構成し、使用することを喜んで覚えています。

+0

これは、WSDLのxsdファイルの構造と関係があるプラグインを構成する方法とは関係ありません。ルート要素が決定できないように構造化されている場合、追加されません。要求を作成して送信するために使用しているコードは何ですか?(あなたはSpring WSまたは少なくともそのプロジェクトの「WebServiceTemplate」を使用していると仮定します)。 –

+0

WSDLにcomplexType要素が含まれていて、それが宣言された名前を持っていれば、他の場所で参照される可能性があり、したがってルート要素の注釈を持たないと読んでいます。また、一部のJAXB実装では、要素が他の場所で参照されていないこと、指定されたwsdl/XSDのセットがすべて存在することを示す構成要素を入力できることも読んでいます。これは具体的には、このサービスへのリクエストをマーシャリングするために、生成されたクラスを使用したいと思います。私はそれを行うために春のライブラリに固執することを好むだろう。 – arcy

+0

そして、なぜ春の別のbeanの設定を追加するのが春のライブラリを使わないのですか?あなたのXMLに 'Jaxb2Marshaller'を設定して、それを(un)マーシャリングのために使用してください...プラグインの設定と生成されたコードを手動で(あるいはそうでない)混乱させる必要はありません。 –

答えて

2

私はついにこれを手に入れました。それはより簡単でなければならないようです。

JAXBのMavenプラグインのPOMファイルのエントリは次のようになります。私はここにオプションのドキュメントの欠如だった直面する困難の

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxb2-maven-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
       <execution> 
        <id>xjc</id> 
        <goals> 
         <goal>xjc</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <sourceType>wsdl</sourceType> 
       <sources> 
        <source>C:/projects/gw/src/main/resources/wsdl/xo2.wsdl</source> 
       </sources> 
       <extension>true</extension> 
       <xjbSources> 
        <xjbSource>bindings.xjb</xjbSource> 
       </xjbSources> 
      </configuration> 
     </plugin> 

一つ。私は最終的にプラグインコード内のjarファイルを調べ、そこでjaxb2-maven-plugin.pomを見つけ、さまざまなオプションの書式なしのドキュメントを調べました。これが私が "sourceType"、 "sources"、 "xjbSources"タグを発見した方法です。また、私の.m2ディレクトリの一部で、さまざまなバージョンを利用できるようになりました.Web上で入手可能なドキュメントは、1.xと2.xの主な違いを警告します。とにかく、私はしかし、以下のバインディングファイルを発見した

は、以降のプラグインのこのバージョンではバインディングファイルを指定する方法まではわかりませんでした:

<?xml version="1.0"?> 
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" 
       jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <jxb:bindings> 
     <jxb:globalBindings> 
      <xjc:simple/> 
     </jxb:globalBindings> 
    </jxb:bindings> 
</jxb:bindings> 

バインディングでの仕様は、原因です生成されたソースの@XmlRootElement。 WSDLに定義された名前を持つ複雑な型がある場合は、これが必要です。

はその後、私のクライアントはこれに煮詰め:最終Springアプリケーションで

public class XOClient extends WebServiceGatewaySupport { 
    public GetPricingResponse getPricingResponse(GetPricing pricingRequest) { 
     Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); 
     marshaller.setClassesToBeBound(GetPricing.class, GetPricingResponse.class); 
     setMarshaller(marshaller); 
     setUnmarshaller(marshaller); 


     String uri = "https://blah.blah.blah.com/services/pricing"; 
     Object o = getWebServiceTemplate().marshalSendAndReceive(uri, pricingRequest); 
     GetPricingResponse response = (GetPricingResponse)o; 
     return response; 
    } 
} 

、私はそれらを設定する代わりに、コードを書くのマーシャラーURIおよび結合したクラスを設定することが多くなりますが、中に使用します私の小さなテストプログラムはこれがより簡単でした。

これにより、pricingRequestオブジェクトを構築してGetPricingResponseオブジェクトを取得し、他のAPIメソッドを同様に使用することができます。

これは他の人に役立つことを望みます。

+0

それは動作します!ありがとう – mnhmilu