2015-01-28 17 views
6

Sto tentando di utilizzare JAXB con i campi del tipo LocalDateTime. Ho scritto un adattatore per gestire la conversione:Utilizzo di LocalDateTime con JAXB

public class LocalDateTimeXmlAdapter extends XmlAdapter<String, LocalDateTime> { 
    @Override 
    public String marshal(LocalDateTime arg0) throws Exception { 
     return arg0.toString(); 
    } 

    @Override 
    public LocalDateTime unmarshal(String arg) throws Exception { 
     return LocalDateTime.parse(arg); 
    } 
} 

ho registrato l'adattatore in package-info.java in questo modo:

@XmlJavaTypeAdapters({ 
     @XmlJavaTypeAdapter(type=LocalDateTime.class, value=LocalDateTimeXmlAdapter.class) 
}) 
package xml; 

import java.time.LocalDateTime; 

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters; 

Questo sembra essere sufficiente in base alla this page. Tuttavia, continuo a ricevere il seguente errore:

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
java.time.LocalDateTime does not have a no-arg default constructor. 

capisco il motivo per l'eccezione gettata, ma io difficilmente può aggiungere un costruttore di default per java.time.LocalDateTime. Questo sembra essere un difetto della classe/una strana decisione di design. Ci sono soluzioni alternative?

risposta

2

Quello che dovrebbe funzionare. Una delle seguenti può essere sbagliato:

  1. Dal momento che avete specificato il @XmlJavaTypeAdapter a livello di pacchetto che si applica solo alle proprietà sulle classi nel pacchetto chiamato xml. Esiste una classe nel modello da un diverso pacchetto con una proprietà associata di tipo LocalDateTime?
  2. È anche possibile che il file package-info.java non venga compilato.
1

Avuto lo stesso comportamento: IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions.

My pbm was: Ho diversi pacchetti (tre) in cui è necessario il file package-info.java, come mostrato nello following picture.

I "risolto" questo pbm aggiungendo uno package-info.java in ciascuna delle tre directory. Esempio per il pacchetto fr.gouv.agriculture.dal.ct.planCharge.metier.dao.charge.xml:

@XmlJavaTypeAdapter(type = LocalDate.class, value = LocalDateXmlAdapter.class) 
package fr.gouv.agriculture.dal.ct.planCharge.metier.dao.charge.xml; 

Se qualcuno ha un'idea migliore di copia/incolla in più package-info.java file, grazie in anticipo.