Как прочитать ответ xs:any с помощью CXF Generated Client?

При использовании веб-сервиса с CXF 2.1.4 (сгенерированный клиент) у меня возникают проблемы с получением ответа на основе следующего фрагмента XSD в WSDL. CXF генерирует список, представляющий его, но когда я запускаю службу, в ответ приходит нуль. Я использовал wirehark для того, что я получал, и действительно, ответ XML приходит, как и ожидалось, но CXF просто дает мне нулевой объект. Открытые службы реализованы с использованием .NET.

Ниже XSD объекта ответа. И

    <!--- chunk -->
     <s:element name="GestionSIIFResponse">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="GestionSIIFResult">
          <s:complexType mixed="true">
            <s:sequence>
              <s:any />
            </s:sequence>
          </s:complexType>
        </s:element>
      </s:sequence>
    </s:complexType>
  </s:element>
  <!--- chunk -->

И вот ответ, который я получаю от службы:

   <soap:Body>
  <GestionSIIFResponse xmlns="http://tempuri.org/">
     <GestionSIIFResult>
        <Siif xmlns="">
           <Pagina>NUY001B</Pagina>
           <Exitos>
              <ExitoRep>
                 <CodExito>SIL0082</CodExito>
                 <DesExito>La transaccion se ha aplicado satisfactoriamente</DesExito>
              </ExitoRep>
           </Exitos>
           <InformacionCab/>
           <Repeticiones/>
        </Siif>
     </GestionSIIFResult>
  </GestionSIIFResponse>

Below is the Generated java class that should "hold" the response from the web service

/*
*  some imports here
*/

/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="GestionSIIFResult" minOccurs="0">
 *           &lt;complexType>
 *             &lt;complexContent>
 *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *                 &lt;sequence>
 *                   &lt;any/>
 *                 &lt;/sequence>
 *               &lt;/restriction>
 *             &lt;/complexContent>
 *           &lt;/complexType>
 *         &lt;/element>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "gestionSIIFResult"
})
@XmlRootElement(name = "GestionSIIFResponse")
public class GestionSIIFResponse {

    @XmlElement(name = "GestionSIIFResult")
    protected GestionSIIFResponse.GestionSIIFResult gestionSIIFResult;

    /**
     * Gets the value of the gestionSIIFResult property.
     * 
     * @return
     *     possible object is
     *     {@link GestionSIIFResponse.GestionSIIFResult }
     *     
     */
    public GestionSIIFResponse.GestionSIIFResult getGestionSIIFResult() {
        return gestionSIIFResult;
    }

    /**
     * Sets the value of the gestionSIIFResult property.
     * 
     * @param value
     *     allowed object is
     *     {@link GestionSIIFResponse.GestionSIIFResult }
     *     
     */
    public void setGestionSIIFResult(GestionSIIFResponse.GestionSIIFResult value) {
        this.gestionSIIFResult = value;
    }


    /**
     * <p>Java class for anonymous complex type.
     * 
     * <p>The following schema fragment specifies the expected content contained within this class.
     * 
     * <pre>
     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;any/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * </pre>
     * 
     * 
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "content"
    })
    public static class GestionSIIFResult {

        @XmlMixed
        @XmlAnyElement(lax = true)
        protected List<Object> content;

        /**
         * Gets the value of the content property.
         * 
         * <p>
         * This accessor method returns a reference to the live list,
         * not a snapshot. Therefore any modification you make to the
         * returned list will be present inside the JAXB object.
         * This is why there is not a <CODE>set</CODE> method for the content property.
         * 
         * <p>
         * For example, to add a new item, do as follows:
         * <pre>
         *    getContent().add(newItem);
         * </pre>
         * 
         * 
         * <p>
         * Objects of the following type(s) are allowed in the list
         * {@link Object }
         * {@link String }
         * 
         * 
         */
        public List<Object> getContent() {
            if (content == null) {
                content = new ArrayList<Object>();
            }
            return this.content;
        }

    }

}

Ниже сгенерированного прокси-порта

/**
 * This class was generated by Apache CXF 2.1.4
 * Mon Jan 17 12:02:39 COT 2011
 * Generated source version: 2.1.4
 * 
 */

@WebService(targetNamespace = "http://tempuri.org/", name = "WSGYG05Soap")
@XmlSeeAlso({ObjectFactory.class})
public interface WSGYG05Soap {

    @ResponseWrapper(localName = "GestionSIIFResponse", targetNamespace = "http://tempuri.org/", className = "suramericana.banw.servicios.tuya.v2.GestionSIIFResponse"/*"org.tempuri.GestionSIIFResponse"*/)
    @RequestWrapper(localName = "GestionSIIF", targetNamespace = "http://tempuri.org/", className = "suramericana.banw.servicios.tuya.v2.GestionSIIF"/*"org.tempuri.GestionSIIF"*/)
    @WebResult(name = "GestionSIIFResult", targetNamespace = "http://tempuri.org/")
    @WebMethod(operationName = "GestionSIIF", action = "http://tempuri.org/GestionSIIF")
    public GestionSIIFResponse.GestionSIIFResult gestionSIIF(
        @WebParam(name = "Peticion", targetNamespace = "http://tempuri.org/")
        GestionSIIF.Peticion peticion,
        @WebParam(header = true,name="CabAut", targetNamespace = "http://tempuri.org/")
        CabAut cabAut
    );
    //@ResponseWrapper(localName = "GestionSIIFResponse", targetNamespace = "http://tempuri.org/", className = "suramericana.banw.servicios.tuya.v2.GestionSIIFResponse"/*"org.tempuri.GestionSIIFResponse"*/)
    //@RequestWrapper(localName = "GestionSIIF", targetNamespace = "http://tempuri.org/", className = "suramericana.banw.servicios.tuya.v2.GestionSIIF"/*"org.tempuri.GestionSIIF"*/)
    //@WebResult(name = "GestionSIIFResult", targetNamespace = "http://tempuri.org/")
    //@WebMethod(operationName = "GestionSIIF", action = "http://tempuri.org/GestionSIIF")
    /*public GestionSIIFResponse.GestionSIIFResult gestionSIIF(
        @WebParam(name = "Peticion", targetNamespace = "http://tempuri.org/")
        GestionSIIF.Peticion peticion,
        @WebParam(header = true,name="CabAut", targetNamespace = "http://tempuri.org/")
        CabAut cabAut
    );*/
}

person mfcabrera    schedule 04.02.2011    source источник
comment
Можете ли вы вставить аннотированные классы/интерфейсы JAXB/JAX-WS, созданные из этого wsdl?   -  person whaley    schedule 04.02.2011
comment
Готово!. Скажите, если вам нужна дополнительная информация. :-Д   -  person mfcabrera    schedule 04.02.2011


Ответы (1)


List, возвращаемый getContent(), потенциально может содержать различные org.w3c.dom.Element, JAXBElement или полностью связанные классы.

Если контекст JAXB не распознает элемент <Siif>, то JAXB будет действовать осторожно и заполнит список одним объектом Element, представляющим <Siif> и его дочерние элементы. Если он распознает их , он либо будет содержать объект JAXBElementwhich in turn contains aSiifobject, or it may contain theSiif` напрямую.

Java не может выразить это разнообразие в своих типах, поэтому просто привязывается к List<Object>.

person skaffman    schedule 04.02.2011
comment
Спасибо за ответ. Но сам список нулевой. Так что я ничего не смогу разыграть :'( - person mfcabrera; 04.02.2011
comment
Кажется, проблема с нулевым указателем была связана с версией CXF. CXF 2.1.4 не совсем поддерживает это, я обновил его до CXF 2.2.6 (другой официальный выпуск, который мы можем использовать), и он начал заполняться. Поэтому я отмечаю это как лучший ответ на данный момент. Спасибо. - person mfcabrera; 05.02.2011