JAX-WS MarshalException personnalisé avec JAX-B liaisons: Impossible de maréchal de type “java.lang.Chaîne” comme un élément

Je semble avoir un problème avec Jax-WS et Jax-b jouer bien ensemble. J'ai besoin de consommer un service web, qui a un prédéfini WSDL. Lors de l'exécution de la client généré, je reçois l'erreur suivante:

javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException - liés exception:
[com.soleil.istack.SAXException2: impossible de maréchal de type "java.lang.Chaîne" comme un élément parce qu'il manque un @XmlRootElement annotation]

C'est apparu quand j'ai utilisé un externe liaison personnalisée fichier de la carte inutilement complexe types de java.lang.chaîne de caractères. Voici un extrait de mon fichier de liaison:

<?xml version="1.0" encoding="UTF-8"?>
  <bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
      xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
    <bindings schemaLocation="http://localhost:7777/GESOR/services/RegistryUpdatePort?wsdl#types?schema1" node="/xs:schema">
      <bindings node="//xs:element[@name='StwrdCompany']//xs:complexType//xs:sequence//xs:element[@name='company_name']">
        <property>
          <baseType name="java.lang.String" />
        </property>
      </bindings>
      <bindings node="//xs:element[@name='StwrdCompany']//xs:complexType//xs:sequence//xs:element[@name='address1']">
        <property>
          <baseType name="java.lang.String" />
        </property>
      </bindings>
      <bindings node="//xs:element[@name='StwrdCompany']//xs:complexType//xs:sequence//xs:element[@name='address2']">
        <property>
          <baseType name="java.lang.String" />
        </property>
      </bindings>
      ...more fields
  </bindings>
</bindings>

Lors de l'exécution de wsimport contre la condition WSDL, StwrdCompany est généré avec les variables suivantes déclaré:

@XmlRootElement(name = "StwrdCompany")
public class StwrdCompany 
{
    @XmlElementRef(name = "company_name", type = JAXBElement.class)
    protected String companyName;
    @XmlElementRef(name = "address1", type = JAXBElement.class)
    protected String address1;
    @XmlElementRef(name = "address2", type = JAXBElement.class)
    ... more fields

    ... getters/setters

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "value"
    })
    public static class CompanyName {

        @XmlValue
        protected String value;
        @XmlAttribute
        protected Boolean updateToNULL;

        /**
         * Gets the value of the value property.
         * 
         * @return
         *     possible object is
         *     {@link String }
         *     
         */
        public String getValue() {
            return value;
        }

        /**
         * Sets the value of the value property.
         * 
         * @param value
         *     allowed object is
         *     {@link String }
         *     
         */
        public void setValue(String value) {
            this.value = value;
        }

        /**
         * Gets the value of the updateToNULL property.
         * 
         * @return
         *     possible object is
         *     {@link Boolean }
         *     
         */
        public boolean isUpdateToNULL() {
            if (updateToNULL == null) {
                return false;
            } else {
                return updateToNULL;
            }
        }

        /**
         * Sets the value of the updateToNULL property.
         * 
         * @param value
         *     allowed object is
         *     {@link Boolean }
         *     
         */
        public void setUpdateToNULL(Boolean value) {
            this.updateToNULL = value;
        }

       ... more inner classes
       }
   }

Enfin, ici, est l'associé d'extrait à partir du WSDL qui semble être la cause de ce désespoir.

<xs:element name="StwrdCompany">
  <xs:complexType>
    <xs:sequence>
      <xs:element maxOccurs="1" minOccurs="0" name="company_name" nillable="true">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute default="false" name="updateToNULL" type="xs:boolean"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element maxOccurs="1" minOccurs="0" name="address1" nillable="true">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute default="false" name="updateToNULL" type="xs:boolean"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      ... more fields in the same format

      <xs:element maxOccurs="1" minOccurs="0" name="p_source_timestamp" nillable="false" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="company_xid" type="xs:string"/>
  </xs:complexType>
</xs:element>

La raison de la liaison personnalisée est si je peux la carte entrée de l'utilisateur à partir d'un pojo dans le StwrdCompany objet plus facilement, que ce soit instanciation directe ou par le biais de l'utilisation de Bulldozers pour bean cartographie. J'ai été incapable de réussir à la carte entre les objets sans la liaison personnalisée.

Enfin, une autre chose que j'ai essayé était un globalBinding définition:

<globalBindings generateValueClass="false"></globalBindings>  

Cette provoqué le serveur par le biais d'un argument exception d'incompatibilité depuis le Message Soap a été à l'aide xs:string xml types au lieu de passer le défini des types complexes, j'ai donc abandonné cette idée.

Tout aperçu de ce qui est à l'origine de la MarshalException ou comment résoudre le problème de l'appel du webservice et de la cartographie de ces objets plus facilement, est très appréciée. J'ai cherché pendant des jours et malheureusement je pense que je suis perplexe.

OriginalL'auteur tnicks | 2010-04-13