2011-10-26 11 views
6

Tengo que generar un elemento xml que pueda tener como valor cualquier "tipo primitivo" (xsd: cadena, xsd: booleano, etc.). Ejemplos:JAXB: ¿configura un XmlAdapter solo para un subtipo específico de un elemento?

<field xsi:type="xsd:string" name="aString">String Value</field> 
<field xsi:type="xsd:dateTime" name="aDate">2011-10-21</field> 
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field> 
... 

Por lo tanto, utilizan esta aplicación que hace JAXB decidir el xsi:type del tipo primitivo:

public class Field { 
    @XmlAttribute 
    private String name; 

    @XmlElement 
    Object value; 
} 

y está funcionando como se esperaba, pero todo el java.util.Date Obtiene el tipo xs:dateTime ...

Ahora quieren cambiar el comportamiento del contador de referencias sólo cuando el objeto 'valor' es una instancia de java.util.Date a campos obtiene así:

<field xsi:type="xsd:date" name="aDate">2011-10-21</field> 
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field> 

lo tanto, crear un adaptador, pero si intento esto:

@XmlElement 
@XmlJavaTypeAdapter(DateAdapter.class) 
Object value; 

El mosto adaptador controla un tipo java.lang.Object

public class DateAdapter extends XmlAdapter<String, Object> {...} 

Pero no quiero perder el JAXB Marshallers para todos los demás objetos (Integer, Double, etc.) ...

hay una forma de configurar un adaptador para un subtipo específico de un elemento?

+0

¿Encontró alguna solución para esto? – nhylated

+0

No, realmente ... Tengo un adaptador que maneja la clase Object y administra internamente cada subtipo. No es "agradable", pero funciona. – ggarciao

Respuesta

-1

tratar

http://jaxb.java.net/guide/Mapping_interfaces.html#Use__XmlJavaTypeAdapter

XmlJavaTypeAdapter para las interfaces con múltiples implementaciones

+1

-1 ¿Has leído la pregunta? Implementé un 'XmlAdapter ' pero con esto pierdo el adaptador para 'Integer, Double, etc'. Lo que quiero es mantener esos adaptadores, y obviamente, si uso un adaptador para el objeto, lo más fácil es generar un 'xsi: anyType', pero eso es exactamente lo que no quiero – ggarciao

+0

En cuanto a su solución de" múltiples implementaciones " , eso implica que tengo que manejar y adaptar el 'Objeto' e implementar un contenedor para cada subclase de objeto para generar el' xsi: type' correcto. De nuevo, aquí estoy perdiendo los adaptadores que quiero conservar. – ggarciao

0

me enfrentaba a una situación similar, aunque yo estaba que vienen de la XSD y la generación de las clases a partir de ahí. Dicho esto, la solución también debe poderse transponer a usted.

En mis casos, quería extender el uso de un String simple en el modelo XSD para que aparezca como un UUID en el código Java, luego otro aparecería como una clase en otros lugares y así sucesivamente. Lado XML, es todo cadena (xs: cadena), entonces, ¿cómo obtener todas estas cadenas en tipos separados lado java ...

Lo que terminé haciendo es, en el XSD creé tipos simples para cada caso, aquí el Declaración UUID:

y utilizar esto en vez de una cadena dondequiera que sea necesario.

Luego creé un archivo de enlaces donde especifiqué mis XmlAdaptors, de forma muy parecida a como lo hizo, excepto que ahora tengo objetivos separados y puedo usar adaptadores específicos para cada "tipo" de xml.

Ahora, usted tiene una dificultad adicional aquí es que en el lado de Java, la representación de su campo es solo un objeto. Supongo que lo lanzarás una vez que conozcas el atributo de tipo. Quizás crear una subclase de campo para cada caso, esto le permita cambiar la declaración typeADaptor.

Cuestiones relacionadas