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
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'ajouter un
<xjc:simple />
élément à l'intérieur de votre<jaxb:globalBindings>
section pour la fabrication de JAXB la manipulation de la racine éléments correctement. Il suffit d'insérer la ligne suivante dans votre fichier de liaisonsJ'ai un JAXB cartographie de l'échantillon ici vous pouvez utiliser pour trouver de l'inspiration.
OriginalL'auteur Lars Tackmann
Cette erreur signifie que JAXB est d'essayer de marshall une Chaîne comme s'il s'agissait d'un élément XML -- ce qui n'est évidemment pas le cas. Ainsi, par exemple triage "toto" en tant que XML, alors qu'en réalité il devrait être quelque chose comme "foo". La raison qu'il fait c'est à cause de la cartographie... fabrication d'un élément d'une Chaîne a aussi le même effet l'autre sens: c'est donc en essayant de carte de la Chaîne à un élément, ce qui résulte en XML non valide.
Lars' solution devrait fonctionner. L'autre chose que vous pouvez faire est de l'associer à un (simple) classe personnalisée qui JAXB peut maréchal. Si vous êtes courageux, vous pouvez essayer de déconner avec le JAXBElement trop.
OriginalL'auteur Gabriel Jiva