2010-10-17 13 views
6

Al usar JAXB con Java-First, los campos/propiedades de tipo java.util.Date se agrupan y desasignan como xs:dateTime y todo funciona como se esperaba.Dile a JAXB que elimine la carga <xs:dateTime> a la clase Date usando las anotaciones

Pero si el tipo de campo/propiedad es Object, JAXB unmarshals xs:dateTime a XMLGregorianCalendarImpl.

Tengo que encontrar una manera que hace que los valores de fecha y hora unmarshal JAXB a java.util.Date por sí mismo utilizando anotaciones. De lo contrario, tendré que revisar todos los valores no asignados en cada caso de uso.

Incluso si hubiera algún after-unmarshall-hook para definir en las clases que contienen los campos Object y convertir las instancias manualmente sería bueno. Pero no pude encontrar nada que pueda usarse de esta manera tampoco.

Tenga en cuenta que tengo acceso limitado al contexto de JAXB, ya que se usa dentro de Apache CXF.

Respuesta

4

Puede establecer la propiedad de tipo en @XmlElement.

@XmlElement(type=Date.class) 
public Object getGenericDateProperty() { 
    return date; 
} 

Editar:

Dado que usted no sabe el tipo que podría utilizar un XmlAdapter. Si el valor no asignado es un XMLGregorianCalendar conviértalo en una Fecha. Para obtener más información sobre XmlAdapter ver:

+0

El objeto no siempre es una Fecha. Puede ser de varios tipos. En el XSD generado, se especifica como xs: anyType. La fecha es uno de los valores posibles. – Iravanchi

+0

Puede escribir un XmlAdapter para convertir entre tipos de fecha. –

+0

Tengo un XmlAdapter para convertir entre XMLGregorianCalendar y Date, pero no puedo aplicarlo a un campo de tipo Object usando @XmlJavaTypeAdapter - resulta en IllegalAnnotationException. – Iravanchi

5

Además de la respuesta de Blaise Doughan:

finalmente pude resolver esto, gracias por la ayuda de Blaise Doughan. En realidad, su respuesta funciona con solo un pequeño cambio: si hay varios tipos que se espera que no estén clasificados como la propiedad Object, debe haber múltiples anotaciones @XmlElement colocadas en él usando la anotación @XmlElements.

Aquí está mi código de ahora:

@XmlElements 
     ({ 
       @XmlElement(name = "dateValue", type = Date.class), 
       @XmlElement(name = "stringValue", type = String.class), 
       @XmlElement(name = "booleanValue", type = Boolean.class), 
       @XmlElement(name = "listValue", type = ArrayList.class), 
       @XmlElement(name = "bytesValue", type = Byte[].class) 
     }) 
public Object getFieldValue() 
{ 
    return fieldValue; 
} 

Nota: la especificación de "nombre" que se requiere para que esto funcione, ya que debe haber una manera para que el contador de referencias/unmarshaller para identificar el tipo de contenido.

Hay dos cuestiones menores aquí:

  1. Es necesario especificar una lista de todos los tipos esperados (lo cual es lógico, dado el caso de maniobras)

  2. No hay ninguna manera de especifica un solo nombre para esta propiedad. En mi caso, cuando JAXB se usa en servicios web CXF, el código generado a partir de WSDL en .NET nombra este campo como "Artículo". Si hubiera una manera, por ejemplo, de ajustar los elementos XML en otro que tenga un solo nombre, el código generado podría ser un poco más agradable.

Cuestiones relacionadas