@XmlJavaTypeAdapter unmarshaled Объект равен нулю

У меня вопрос: как jax-ws генерирует демаршальный код, связанный с @XmlJavaTypeAdapter? Я не вижу класс (ы) адаптера в клиентском коде (вместо этого они разбиты на свои адаптированные объекты). Таким образом, как клиент узнает, как разархивировать возвращенный маршалированный ответ при вызове метода веб-службы?


Подробности:

Я использую аннотацию @XmlJavaTypeAdapter внутри другой аннотации @XmlJavaTypeAdapter, чтобы превратить Map<> в ArrayList. Маршаледовый результат выходит хорошо. Мой клиент, сгенерированный jax-ws, похоже, не может разобрать результат. Вместо этого я просто получаю нулевой объект.

Вот 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 (Object of 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;
}} 


Любые идеи о том, что вызывает нулевой объект в клиенте?

0 ответов

Другие вопросы по тегам