2010-10-17 10 views
6

Quando si utilizza JAXB con Java-First, i campi/proprietà di tipo java.util.Date vengono sottoposti a marshalling e unmarshalled come xs:dateTime e tutto funziona come previsto.Dillo a JAXB alla classe unmarshal <xs:dateTime> alla data utilizzando annotazioni

Ma se il tipo di campo/proprietà è Object, JAXB unmarshals xs:dateTime a XMLGregorianCalendarImpl.

Ho bisogno di trovare un modo che faccia sì che i valori JAXB di data e ora unmarsed siano java.util.Date usando le annotazioni. Altrimenti, avrò bisogno di passare attraverso tutti i valori non marroni in ogni caso d'uso.

Anche se esistessero alcuni hook after-unmarshall da definire nelle classi contenenti i campi Object e la conversione manuale delle istanze sarebbe buona. Ma non sono riuscito a trovare nulla che possa essere usato in questo modo.

Nota che l'accesso al contesto JAXB è limitato, poiché viene utilizzato all'interno di Apache CXF.

risposta

4

È possibile impostare la proprietà type su @XmlElement.

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

Edit:

Dal momento che non si conosce il tipo si potrebbe usare un XMLAdapter. Se il valore unmarshalled è un XMLGregorianCalendar convertirlo in una data. Per maggiori informazioni su XMLAdapter vedere:

+0

L'oggetto non è sempre una data. Può essere di vari tipi. Nell'XSD generato, è specificato come xs: anyType. La data è uno dei valori possibili. – Iravanchi

+0

È possibile scrivere un XmlAdapter per la conversione tra i tipi di data. –

+0

Possiedo un XmlAdapter per la conversione tra XMLGregorianCalendar e Date, ma non riesco ad applicarlo a un campo di tipo Object utilizzando @XmlJavaTypeAdapter - risulta in IllegalAnnotationException. – Iravanchi

5

Oltre alla risposta di Blaise Doughan:

ho potuto finalmente capire questo, grazie per l'aiuto di Blaise Doughan. In realtà la sua risposta funziona solo con una piccola modifica: se ci sono diversi tipi che si prevede siano non rari come proprietà Object, ci devono essere più annotazioni @XmlElement posizionate su di essa usando l'annotazione @XmlElements.

Ecco il mio codice ora:

@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: specificando "nome" è necessario per far funzionare tutto questo, dal momento che ci dovrebbe essere un modo per la marshaller/unmarshaller per identificare il tipo di contenuto.

Ci sono due questioni minori qui:

  1. È necessario specificare un elenco di tutti i tipi di attese (che è logico, dato il caso di smistamento)

  2. non c'è modo di specificare un singolo nome per questa proprietà. Nel mio caso, dove JAXB viene utilizzato nei servizi Web CXF, il codice generato da WSDL in .NET assegna a questo campo il nome "Articolo". Se c'era un modo, per esempio, per avvolgere gli elementi XML in un altro che ha un singolo nome, il codice generato potrebbe essere un po 'più bello.

Problemi correlati