В JAXB, как использовать аннотацию @XmlJavaTypeAdapters? - PullRequest
6 голосов
/ 12 января 2011

Я хочу изменить "javax.xml.datatype.XMLGregorianCalendar" на "java.util.Date" при отмене сортировки из XML в класс Java JAXB.

Но я не помещаю аннотации @XmlJavaTypeAdapter в классы Java.

Итак, я попытаюсь использовать аннотацию @XmlJavaTypeAdapters, но я не знаю, как ее использовать ...

Пожалуйста, покажите мне примеры его использования.

1 Ответ

10 голосов
/ 13 января 2011

Как интересно, на самом деле вам не нужно адаптировать XMLGregorianCalendar к Date, поскольку JAXB изначально поддерживает java.util.Date - например, так:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Example {
    @XmlSchemaType(name = "date")
    public Date publishingDate;
}

Если вам это нужно, @XmlJavaTypeAdapter может работать следующим образом, предполагая, что ваш пользовательский класс:

public class SillyDate {
    public SillyDate(int year, int month, int day) {
        super();
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public String toString() {
      return "SillyDate [year=" + year + ", month=" + month + ", day=" + day + "]";
    }

    public int year;
    public int month;
    public int day;
}

Вам нужен класс, который JAXB может понять, а затем написать адаптер между этим классом и пользовательским классом, например:

public class SillyDateAdapter extends XmlAdapter<XMLGregorianCalendar, SillyDate> {
    public SillyDate unmarshal(XMLGregorianCalendar val) throws Exception {
      return new SillyDate(val.getYear(), val.getMonth(), val.getDay());
    }

    public XMLGregorianCalendar marshal(SillyDate val) throws Exception {
      return DatatypeFactory.newInstance().newXMLGregorianCalendarDate(val.year, val.month, val.day, 0);
    }
}

Теперь вы можете использовать это в своих собственных классах, например:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Example2 {
    @XmlSchemaType(name = "date")
    @XmlJavaTypeAdapter(type=XMLGregorianCalendar.class,value =SillyDateAdapter.class)
    public SillyDate publishingDate;
}

Существует множество хороших примеров использования @XmlJavaTypeAdapter, доступных в сети, например этот и этот и несколько других. Счастливая адаптация!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...