私の質問は、jax-ws は @XmlJavaTypeAdapter に関連付けられた非整列化コードをどのように生成するのですか? クライアント コードにアダプター クラスが表示されません (代わりに、適応したオブジェクトに分割されます)。では、クライアントは、Web サービス メソッドが呼び出されたときに、返されたマーシャリングされた応答をアンマーシャリングする方法をどのように知るのでしょうか?
詳細:
Map<> を ArrayList に変換するために、別の @XmlJavaTypeAdapter アノテーション内で @XmlJavaTypeAdapter アノテーションを使用しています。マーシャリングされた結果はうまくいきます。ただし、jax-ws で生成されたクライアントは、結果をアンマーシャリングできないようです。代わりに、null オブジェクトを取得するだけです。
クライアントに送信される XML は次のとおりです。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<dlwmin:getRefTableResponse xmlns:dlwmin="http://service.web.test/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<wsRefDataObject>
<map>
<entry>
<key>05</key>
<value>
<columns>
<entry>
<key>state</key>
<value>CA</value>
</entry>
<entry>
<key>code</key>
<value>05</value>
</entry>
</columns>
</value>
</entry>
</map>
</wsRefDataObject>
</dlwmin:getRefTableResponse>
WsRefDataOject のアダプタ クラスは次のとおりです。
ReferenceDataEntry 非整列化コード (Map のオブジェクト) にも同じロジックを使用します。
public class MyMapAdapter extends XmlAdapter<MyMapType, Map<String,ReferenceDataEntry>> {
public MyMapType marshal(Map<String,ReferenceDataEntry> bt) throws Exception {
MyMapType myMapType = new MyMapType();
for(Map.Entry<String,ReferenceDataEntry> entry : bt.entrySet()) {
MyMapEntryType myMapEntryType = new MyMapEntryType();
myMapEntryType.key = entry.getKey();
myMapEntryType.value = entry.getValue();
myMapType.entry.add(myMapEntryType);
}
return myMapType;
}
public Map<String, ReferenceDataEntry> unmarshal(MyMapType v) throws Exception {
Map<String, ReferenceDataEntry> map = new HashMap<String, ReferenceDataEntry>();
for(MyMapEntryType myEntryType : v.entry){
map.put(myEntryType.key, myEntryType.value);
}
return map;
}
}
マーシャル コードにブレークポイントを設定し、それをサービスでステップ実行できます。ただし、非整列化コードがいつどこで保存/呼び出されるかはわかりません。アダプター クラスはクライアントで生成されないため、返された xml を非整列化する方法をクライアントがどのように知っているのかわかりません。
生成された WsRefDataObject クラスと生成された ReferenceDataEntry クラスを次に示します。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "wsRefDataObject", namespace = "http://service.web.test/", propOrder = {
"map"})
public class WsRefDataObject {
protected MyMapType map;
/**
* Gets the value of the map property.
*
* @return
* possible object is
* {@link MyMapType }
*
*/
public MyMapType getMap() {
return map;
}
/**
* Sets the value of the map property.
*
* @param value
* allowed object is
* {@link MyMapType }
*
*/
public void setMap(MyMapType value) {
this.map = value;
}}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "referenceDataEntry", namespace = "http://service.web.test/", propOrder = {
"columns"})
public class ReferenceDataEntry {
protected RefMapType columns;
/**
* Gets the value of the columns property.
*
* @return
* possible object is
* {@link RefMapType }
*
*/
public RefMapType getColumns() {
return columns;
}
/**
* Sets the value of the columns property.
*
* @param value
* allowed object is
* {@link RefMapType }
*
*/
public void setColumns(RefMapType value) {
this.columns = value;
}}
クライアントで null オブジェクトの原因について何か考えはありますか?