it-swarm.com.ru

Может ли JAXB обрабатывать объекты Java.time?

Я знаю JAXB (Java-архитектура для привязки XML) может маршалировать/демаршировать объекты Java.util.Date, как видно из этот ответ Блейз Дафан .

Но как насчет новых Java.time package объектов в Java 8 , таких как ZonedDateTime ? Был ли обновлен JAXB для обработки этого нового встроенного типа данных?

19
Basil Bourque

В Java SE 8 JAXB еще не был обновлен для поддержки типов Java.time .

Действительно, есть проблема , связанная с этим в ссылочной реализации.

Вам нужно создать и использовать XmlAdapter для обработки этих типов. Используйте подход, аналогичный тому, который был сделан с Joda-Time , как описано в этой публикации, JAXB и Joda-Time: Dates and Times .

Вы можете использовать эта реализация адаптеров для Java.time .

20
Blaise Doughan

Мы не могли использовать библиотеку, связанную в принятом ответе, поскольку она закрывает важную деталь: в XML-схеме значения даты/времени допускают отсутствие смещения часового пояса. Адаптер должен быть в состоянии справиться с этой ситуацией. Кроме того, должен поддерживаться тот факт, что Java не имеет тип данных только для даты.

библиотека JaxbDateTime решает эту проблему.

Если вращается вокруг классов даты/времени Offset... JDK8, поскольку они являются (единственным) естественным эквивалентом для типов схемы XML date, dateTime и time.

Используйте как это:

Добавить зависимость:

<dependency>
    <groupId>com.addicticks.oss.jaxb</groupId>
    <artifactId>Java8datetime</artifactId>
    <version> ... latest ...</version>
</dependency>

Аннотируйте свои классы:

public class Customer {

    @XmlElement
    @XmlJavaTypeAdapter(OffsetDateTimeXmlAdapter.class)
    @XmlSchemaType(name="dateTime")
    public OffsetDateTime getLastOrderTime() {
        ....
    }

    @XmlElement
    @XmlJavaTypeAdapter(OffsetDateXmlAdapter.class)
    @XmlSchemaType(name="date")
    public OffsetDateTime getDateOfBirth() {   // returns a date-only value
        ....
    }
}

Если вы не хотите аннотировать каждый класс отдельно, вы можете использовать аннотации на уровне пакета, как описано в README .

Также README объясняет, как использовать, если вы генерируете классы из файлов XSD с помощью инструмента xjc.

0
lbruun