3

WSDL を作成し、XSD の下敷きにすることによって定義された Web サービスがあり、Java サーバー コード クラス/Java バインディングは JAXB/xjc を使用して生成されました。

サービスはすべて正常に実行されているように見えます...しかし、すべてのリクエスト(ログ出力を見ると受信後に整形式に見える)に対して、Javaコードからアクセスすると、ネストされた要素は常にnullのようです。

customerId.getCustomer() が常に null を返す理由を誰かが理解できますか?

私のXSD(部分的):

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:tip="http://example.org/tip" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.org/tip/pro">

<complexType name="id">
  <attribute name="id" type="int" use="required"/>
  <attribute name="name" type="string" use="optional"/>
</complexType>

<complexType name="customer_id">
  <sequence>
    <element name="customer" type="tip:id" minOccurs="0"/>
  </sequence>
</complexType>

<element name="get_customer_request" type="tip:customer_id"/>

</schema>

生成されたクラス CustomerId:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "customer_id", propOrder = {"customer"})
public class CustomerId {
  protected Id customer;

  public Id getCustomer() {
    return customer;
  }

  public void setCustomer(Id value) {
    this.customer = value;
  }
}

生成された Id のクラスは似ていますが、特別なことはないと思います。私のリクエストハンドラーでは、次の抜粋を取得しました。

ハンドラ:

JAXBElement<?> request = requestHandler.unmarshallRequest(inputStream);
Object jaxbClass = request.getDeclaredType();
expectedClass = CustomerId.class;
// next line does not throw exception with given XML
if (jaxbClass != expectedClass) throw new IllegalArgumentException();

CustomerId customerId = (CustomerId)request.getValue();
if (customerId == null) {
  logInfo("customerId: null");
} else if (customerId.getCustomer() == null) {
  // this is the part that always will be executed... why?
  logInfo("customerId.customer: null");
} else {
  logInfo("customer id: " + customerId.getCustomer().getId());
  // return mbean.getCustomer(customerId);
}

最後にリクエスト XML の例を示します。

<?xml version="1.0" encoding="ISO-8859-1"?>
<m:get_customer_request xmlns:m="http://example.org/tip/pro">
  <customer id="0" name="help"/>
</m:get_customer_request>

問題が発生していないため、SOAP エンベロープとボディ タグを削除しました。私が間違っていることを誰でも見ることができますか?(私はかなり確信しています、そうです...)あなたの努力に感謝します!

4

1 に答える 1

3

パート1

新しい Id を作成し、これで customerId.customer を設定すると、完全な出力は次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<get_customer_request xmlns="example.com/tip/pro">
    <customer name="xy" id="1"/>
</get_customer_request>

この情報に基づくと、JAXB マッピングはcustomer要素がexample.com/tip/pro名前空間にあることを想定しているようで、リクエスト ドキュメントは次のようになります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<m:get_customer_request xmlns:m="http://example.org/tip/pro">
  <m:customer id="0" name="help"/>
</m:get_customer_request>

パート2

リクエストで m: プレフィックスを customer 要素に付けると、パーサーは m:customer と期待された顧客を見つけたと不平を言います。

これは、XML スキーマがマッピングと一致しないことを意味します。要素が名前空間にあると予想customerされる場合は、XML スキーマを次のように変更できます。

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns:tip="http://example.org/tip" 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.org/tip/pro"
    elementFormDefault="qualified">

    ...

</schema>

JAXB と名前空間の詳細については、次を参照してください。

于 2012-10-04T16:03:45.577 に答える