2010-03-15 16 views
6

Deseo personalizar la clasificación de fechas en JAXB. Es una variante de esto ya pedido question. Yo pensaría que usaría un XMLAdapter, como especifica this answer preguntas.Cómo personalizar la asignación de referencias de JAXB si se generan beans JAXB a partir de XML

Pero no puedo hacer eso exactamente, porque voy a la inversa, generando los beans JAXB desde un .XSD - No puedo agregar anotaciones a los beans JAXB porque son código generado.

He intentado llamar a Marshaller.setAdapter(), pero sin suerte.

  final Marshaller marshaller = getJaxbContext().createMarshaller(); 
      marshaller.setSchema(kniSchema); 
      marshaller.setAdapter(new DateAdapter()); 
      ... 
      private static class DateAdapter extends XmlAdapter<String, XMLGregorianCalendar> { 
      @Override 
      public String marshal(XMLGregorianCalendar v) throws Exception { 
       return "hello"; //Just a test to see if it's working 
      } 
      @Override 
      public XMLGregorianCalendar unmarshal(String v) throws Exception { 
       return null; // Don't care about this for now 
      } 
} 

Cuando la parte pertinente de mi grano de JAXB generada tiene el siguiente aspecto:

@XmlSchemaType(name = "date") 
    protected XMLGregorianCalendar activeSince; 

Cuando hago esto, lo que sucede el día de clasificación/XMLGregorianCalendar defecto. Es como si no lo hubiera hecho todo.

Cualquier ayuda es apreciada.

Gracias,

Charles

Respuesta

2

la forma preferida para cambiar el tipo de límite en el Java generado por XJC es el uso de una personalización de unión.

https://jaxb.dev.java.net/guide/Using_different_datatypes.html

JAXB tiene una tabla incorporada que determina qué clases de Java se utilizan para representar lo esquema XML incorporado tipos, pero esto puede ser personalizado.

Uno de los casos de uso común para la personalización es reemplazar el XMLGregorianCalendar con el calendario o fecha más amigable. XMLGregorianCalendar está diseñado para ser 100% compatible con el sistema/hora fecha de esquema XML, tales como proporcionar precisión infinita en las sub-segundos y años, pero a menudo la facilidad de uso de esas clases Java familiares ganan más de la precisa compatibilidad.

Esa página no te dice cómo cablear realidad la personalización, sin embargo, así echar un vistazo aquí para ver cómo hacerlo:

http://jaxb.java.net/tutorial/section_5_6_1-Overriding-the-Datatype.html#Overriding%20the%20Datatype

+0

Gracias, que funciona. Era nuevo en JAXB y no me di cuenta de que podía personalizar los enlaces de esa manera. –

+0

Ese sitio web de java.net se ha reducido y, por lo tanto, ese URL tutorial ya no funciona. ¿Hay una nueva URL para ese tutorial? –