Jedną z bolączek JAXB jest problematyczna obsługa dat i czasów. Przypomnijmy sobie schemat użyty w jednej z wcześniejszych not.
[sourcecode language=“xml”]
<!-- Definicja książki –>
Jak widać, każda książka ma określoną datę wydania. Jakkolwiek typ date z XML Schema nie jest bezpośrednio odwzorowany do java.util.Date czy też java.util.Calendar. W przypadku implementacji dostarczonej przez Sun mamy do czynienia z obiektami klasy XMLGregorianCalendarImpl. Rozwiązaniem problemu jest dodanie odpowiedniego adaptera. Możemy robić to ręcznie ale najwygodniejszym rozwiązaniem będzie skorzystanie z gotowca - klasy javax.xml.bind.DatatypeConverter. Jej użycie wygląda następująco:
[sourcecode language=“xml”]< ?xml version=“1.0” encoding=“UTF-8”?>
<!-- tutaj deklaracje typów –> [/sourcecode]
Podobne rozwiązanie można wykorzystać na poziomie pojedyńczego elementu aby zmapować konkretny element do obiektu. Element annotation można również dodać do deklaracji simpleType (powiedzmy reprezentacja numeru pesel + proste restrykcje).
[sourcecode language=“xml”]
JAXB wygeneruje wówczas odpowiednie adnotacje dla tworzonych klas oraz adaptery, które odwołują się do metod wskazanych w atrybutach elementu javaType.
W moim przypadku kod klasy Category wygląda następująco: [sourcecode language=“java”]package pl.dywicki.court;
/\\ \* Reprezentacja kategorii sprawy. \* \* @author Lukasz Dywicki luke@code-house.net **/ public class Category {
private String name;
public Category(String value) { this.name = value; }
public static Category parse(String value) { return new Category(value); }
public static String print(Category value) { return value.name; } }[/sourcecode]
Jest to oczywiście maksymalnie uproszczony przykład. W konstruktorze bądź metodach, które konwertują string do obiektu możemy podpiąć walidację i bronić się wyjątkami przed nieprawidłowymi wartościami by uniemożliwić deserializację dokumentu.