Может ли JAXB обрабатывать объекты java.time?
Я знаю, что JAXB (Java Architecture для XML Binding) может маршалировать/демаршалировать объекты java.util.Date, как видно из этого ответа Блеза Дафана.
Но как насчет новых объектов пакета java.time в Java 8, таких как ZonedDateTime
? Был ли обновлен JAXB для обработки этого нового встроенного типа данных?
Ответы
Ответ 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.