2015-03-11 2 views
-2

У меня есть XML-файл в формате, описанном ниже. В настоящее время я использую JAXB для развязывания XML-элементов (event) объектам Java (Event). Все свойства работают хорошо, за исключением одного ...
Как вы можете видеть в XML, то date элемент хранит только дата и time магазины только время мероприятия. Я хотел бы объединить эти два элемента XML в одно поле LocalDataTime с именем time с соответствующими геттерами и сеттерами.Unmarshalling нескольких XML-элементов в одном поле с использованием JAXB

XML:

... 
<event> 
    ... 
    <date>2014-02-19</date> 
    <time>2000-01-01T14:17:00Z</time> 
    ... 
</event> 
... 

Желаемая Java объекта:

public class Event { 
    ... 
    // Returns a combination of the date and time stored in the XML 
    public LocalDateTime getDateTime() { 
     return dateTime; 
    } 
    ... 
} 

Моя первая мысль была использовать XMLAdapter, но кажется, что это только позволяет мне карту 1 XML-элемент 1 объект Java.

После этого я попытался реализовать это, переопределив сеттеры setTime и setDate. Эти сеттеры каждый раз изменяли время или дату сохраненного времени. Но я не смог заставить его работать, и это тоже казалось довольно уродливым способом сделать это.

Я уже читал следующие JAXB convert multiple attributes to one type while unmarshalling. Но для этого проекта я бы предпочел не использовать внешнюю библиотеку, такую ​​как MOXy.

Кто-нибудь знает, как это сделать, используя исключительно JAXB в clean way?

ответ

1

Вы могли бы определить в ваших событий методов объекта жизненного цикла:

void afterUnmarshal(Unmarshaller unm, Object parent) { 
    localDateTime = .... 
}; 
boolean beforeMarshal(Marshaller mar) { 
    date = localDateTime.toDate(); 
    .... 
}; 

построить свойство LocalDateTime после демаршаллизации (с использованием значений даты и времени), а также подготовить поля даты/времени, прежде чем сортировочная с использованием текущего значения LocalDateTime , Вам все равно понадобятся поля времени и даты для соответствия xml, а поле localDateTime должно быть XmlTransient. Таким образом, это не так сильно отличается от подхода set/getter, но, вероятно, более «чистым».