2011-02-25 24 views
8

Tengo una llamada de servicio web. En mi respuesta cuando trato de obtener el elemento xml any en un JAXBElement arroja un error.JAXB no distingue xml ningún elemento de JAXBElement

En el esquema que tengo:

<xs:complexType name="InputType"> 
    <xs:annotation></xs:annotation> 
    <xs:sequence>   
     <xs:element name="Id" type="xs:string" /> 
     <xs:any namespace="##any" processContents="lax" minOccurs="0" /> 
    </xs:sequence> 
</xs:complexType> 

El código que estoy utilizando:

Object obj = inputType.getAny(); 
Object o = ((JAXBElement)obj).getValue(); 

Esta línea lanza el error: org.apache.xerces.dom.ElementNSImpl incompatible with javax.xml.bind.JAXBElement error en la interfaz de usuario de jabón.

¿Por qué no se convierte en JAXBElement? ¿Cómo hago que funcione?

Respuesta

1

valide su xml contra su esquema. que debe ser la primera cosa a comprobarse

9

Si la propiedad está anotado con los siguientes el contenido se va a proyectar como DOM nodos:

@XmlAnyElement 

Si el lax = true indicador se establece elementos conocidos entonces habrá convertidos al dominio objetos:

@XmlAnyElement(lax=true) 

para obtener más información sobre @XmlAnyElement ver:


ACTUALIZACIÓN # 1

Con laxa = true se puede obtener una mezcla de objetos de dominio y los nodos DOM. Lo siguiente es de la documentación de Java:

When true

If true, when an element matches a property marked with XmlAnyElement is known to JAXBContext (for example, there's a class with XmlRootElement that has the same tag name, or there's XmlElementDecl that has the same tag name), the unmarshaller will eagerly unmarshal this element to the JAXB object, instead of unmarshalling it to DOM. Additionally, if the element is unknown but it has a known xsi:type, the unmarshaller eagerly unmarshals the element to a JAXBElement, with the unknown element name and the JAXBElement value is set to an instance of the JAXB mapping of the known xsi:type.

As a result, after the unmarshalling, the property can become heterogeneous; it can have both DOM nodes and some JAXB objects at the same time.


ACTUALIZACIÓN # 2

Para resolver el problema, en última instancia:

  1. Dado que es posible que esa propiedad contenga un nodo DOM, su código debe tener en cuenta esta posibilidad haciendo alguna verificación de tipo.
  2. Para reducir la cantidad de nodos DOM recibidos, debe asociar los posibles elementos raíz de esos fragmentos con las clases de Java. Esto se hace anotando clases con @XmlRootElement (name = "foo", namespace = "bar"), o con @XmlElementDecl.

Visita mi blog para ver un ejemplo:

+0

En este caso, es laxa = true, el dominio de objetos.Pero mi pregunta es por qué el desajuste se queja de que no es compatible con el objeto JAXBElement. – valve2010

+0

Aún puede obtener nodos DOM en su propiedad anotados con @XmlAnyElement (lax = true). Ver respuesta actualizada. –

+0

Gracias por la información, ¿cómo puedo obtener el valor de este getAny(). ¿Cuál es la solución? – valve2010

Cuestiones relacionadas