Подтвердить что ты не робот

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

Я знаю, что JAXB (Java Architecture для XML Binding) может маршалировать/демаршалировать объекты java.util.Date, как видно из этого ответа Блеза Дафана.

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Библиотека вращается вокруг OffsetXXX даты/времени OffsetXXX OffsetXXX поскольку они являются (единственным) естественным эквивалентом для типов 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.