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 –> [/sourcecode]

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”?> </jaxb:globalBindings>

<!-- 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”] [/sourcecode]

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.