Pregunta

Si estoy usando JAXB como parte de los servicios web de Metro bajo Glassfish v2, ¿cómo le digo a JAXB que agregue:

 <xsd:any/> and <xsd:anyAttribute/>

las etiquetas a mis tipos complejos generados, de modo que si hago cambios en el futuro para agregar elementos o atributos a mis objetos de respuesta, mis clientes actuales no se romperán.

La documentación JAXB parece faltar un poco.

¿Fue útil?

Solución 2

Ok, así es como lo hice funcionar:

import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;


public class SchemaExtensible
{
    @XmlAnyElement(lax=true)
    private List<Element> otherElements;

    @XmlAnyAttribute
    private Map<QName,Object> otherAttributes;
}

No es ideal porque ahora tengo que extender esta clase para cada clase de respuesta que quiero que sea extensible (y en algunos casos esto impide que me extienda desde una clase de solicitud). Si estos 2 métodos y amp; las anotaciones de nivel de campo podrían mejorarse para permitir que se agreguen a nivel de clase, entonces simplemente podrían estar diciendo "agregue las etiquetas apropiadas al esquema y simplemente deseche los datos si se encuentran" " que sería dulce.

De cualquier manera el fragmento del esquema termina pareciéndose a esto:

<xs:complexType name="SchemaExtensible">
  <xs:sequence>
    <xs:any processContents="lax" namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:anyAttribute namespace="##other" processContents="skip"/>
 </xs:complexType>

Para mí, es preferible permitir esta capacidad de extensión solo para objetos de respuesta a la versión del servicio web, ya que le permite evolucionar el esquema poco a poco, si así lo desea, sin el dolor de cabeza de administrar muchas versiones diferentes, y sin la preocupación de que cualquier cliente existente se romperá si agrega un único atributo o elemento nuevo a un objeto de respuesta.

Otros consejos

Solo usa el tipo java.lang.Object. Por defecto, JAXB generará xsd: cualquiera. He devuelto con éxito una instancia de org.w3c.dom.Node desde un método de servicio web con java.lang.Object como el tipo de retorno. Imagino que habrá algo similar para xsd: anyAttribute, ¿quizás utilizando el tipo de retorno de objeto y la anotación JAXB del atributo XML?

Adición: Las siguientes anotaciones parecen que logran tus metas. Ambos son parte de la especificación JAXB 2.0.

@XmlAnyAttribute @XmlAnyElement

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top