2015-01-28 12 views
6

Próbuję użyć JAXB z polami typu LocalDateTime. Pisałem adapter do obsługi konwersji:Używanie LocalDateTime z 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); 
    } 
} 

Zarejestrowałem adapter package-info.java tak:

@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; 

To wydaje się być wystarczające według this page. jednak wciąż otrzymuję następujący błąd:

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

Rozumiem powód wyjątkiem wyrzucane, ale trudno mi dodać do domyślnego konstruktora java.time.LocalDateTime. To wydaje się być wadą klasy/dziwnej decyzji projektowej. Czy są jakieś obejścia?

Odpowiedz

2

Co powinieneś zrobić. Jeden z niżej wymienionych może być źle:

  1. Od określeniu @XmlJavaTypeAdapter na poziomie pakietu będzie się ono jedynie do właściwości o zajęciach w pakiecie zwanych xml. Czy istnieje klasa w twoim modelu z innego pakietu, który ma zmapowaną właściwość typu LocalDateTime?
  2. Możliwe jest również, że plik package-info.java nie jest kompilowany.
1

To samo zachowanie: IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions.

Mój pbm był: Mam kilka pakietów (trzy), gdzie wymagany jest plik package-info.java, jak pokazano w following picture.

"Rozwiązałem" ten plik pbm, dodając package-info.java w każdym z trzech katalogów. Przykład pakietu 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; 

Jeśli ktoś ma lepszy pomysł niż kopiuj/wklej do kilku package-info.java plików, dzięki z góry.