10

SOAP ベースの Web サービスと通信するプロジェクトを継承しました。私はこれに完全に慣れていませんが、長年 Java を使用しており、XML.

サービス用のWSDLファイルがあり、上部にスキーマがあり、その下にすべてのメッセージ定義が含まれています。問題の核心にあるのは、コードを介してサービスに接続しようとすると、アノテーションが欠落しているため、要素として型「 https.api_blah_com.services.v4.Product@XmlRootElement 」をマーシャリングできないという恐ろしいメッセージが表示されることです]

私のプロジェクトにはすでに jaxws バインディング ファイルがあります。

<jaxws:bindings wsdlLocation="../resources/wsdl/BlahAPI.wsdl"
  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
  <jaxws:bindings  
    node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='https:api.blah.com/services/v4']">
    <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xjc:generateElementProperty>true</xjc:generateElementProperty>
    </jxb:globalBindings>`
  </jaxws:bindings>
</jaxws:bindings>

で生成されたすべての Java クラスを取得するには、有効にするシンプル モード@XmlRootElementを追加する必要があることを読みました。jaxb:globalBinding

これのローカルコピーに追加しようとしましたWSDL

<xs:annotation>
  <xs:appinfo>
    <jaxb:globalBindings>
      <xjc:simple />
    </jaxb:globalBindings>
  </xs:appinfo>
</xs:annotation>

しかし、JAXBコンパイラは、globalBindings のカスタマイズが間違った場所にアタッチされているか、他のバインディングと矛盾しているため、このカスタマイズを尊重できないと不平を言っています。

そこで、次のように、jaxb 用に別のバインディング ファイルを追加してみました。

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <jaxb:bindings schemaLocation="../resources/wsdl/blah.wsdl">
    <jaxb:globalBindings>
      <xjc:simple />
    </jaxb:globalBindings>
  </jaxb:bindings>
</jaxb:bindings>

しかし、blah.wsdl がこのコンパイルの一部ではないというエラーが表示されます。

このサービスを利用する日が近づいています... この 1 つのことを乗り越えることができず、すべてが初めてなので、他に何を試せばよいかわかりません。

WSDLそれらをXSDWSDL?に分割できます。これを機能させるために必要ですか?

4

2 に答える 2

0

JAXB Binding が正しく構成されているかどうか不明です。クラスが要素構造のルートを形成する場合は、@XmlRootElement が必要です。ただし、SOAP では、SOAP 要素が XML のルートを形成するため、ObjectFacory.java クラスが生成されているかどうかを確認します。生成されている場合は、クラス タイプのインスタンスを返すクラス タイプのメソッドが作成されているかどうかを確認します。たとえばclass Foo、メソッドがあります。 Foo のインスタンスを返す `public Foo createFoo() が ObjectFoacory.java に存在する必要があります

ただし、クライアント オプションを有効にして、CXFが提供する WSDL2java を使用することをお勧めします。クライアントコードの構成には数分かかります

于 2013-10-27T10:42:08.070 に答える
0

この場所では、wsdl ではなく xsd ファイルをバインドする必要があると思います。 <jaxb:bindings schemaLocation="../resources/wsdl/blah.wsdl">. リンクのセクション「外部バインディング カスタマイズ ファイル」を参照してください。

于 2013-10-26T06:32:31.760 に答える