Немаршалинг даты из XML-строки в сущность с использованием JAXB

Когда я использую JAXB, что-то не так.

Я конвертирую объект в строку xml, и все в порядке.

Но когда я конвертирую xml String обратно в entity, некоторая информация теряется (все они имеют один и тот же тип java.util.Date).

В объекте:
public Date flightBaseDate;

В xml:
<flightBaseDate>2013-09-16T00:00:00 08:00</flightBaseDate>

после демаршаллинга getFlightBaseDate() возвращает null.

Я погуглил.
Следуя одному предложению, я использовал @ в своей сущности.
Тогда это:

@XmlElement(name = "timestamp", required = true)
public Date flightBaseDate;

Я уверен, что это будет идеально,
но ... выдает исключение, например:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name "flightBaseDate"
    this problem is related to the following location:
at public java.lang.String com.wonders.nlia.omms.vo.FlightServiceInfoVo.getFlightBaseDate()
at com.wonders.nlia.omms.vo.FlightServiceInfoVo
    this problem is related to the following location:
at public java.lang.String com.wonders.nlia.omms.vo.FlightServiceInfoVo.flightBaseDate
at com.wonders.nlia.omms.vo.FlightServiceInfoVo

Почему JAXB не может различить свойство и его getMethod?

Как это решить?

Платформа : jdk7 win7 eclipse tomcat wtp

Мой код демаршаллинга:

JAXBContext context = JAXBContext.newInstance(FlightServiceInfoVo.class);
    Unmarshaller unMarshaller = context.createUnmarshaller();  
    FlightServiceInfoVo flightServiceInfoVo =(FlightServiceInfoVo)unMarshaller.unmarshal(new StringReader(flightServiceInfoVoXml));    

flightServiceInfoVoXml - это строка.


person Ninja    schedule 28.10.2013    source источник


Ответы (2)


Вы можете настроить JAXB разными способами. Вы выбрали аннотации для определения привязки (это нормально, не беспокойтесь).

Я настоятельно рекомендую вам сначала прочитать об этой технике, так как в ней есть много подводных камней. Вот ссылка на хорошее руководство. Вот часть учебника, в которой объясняется, почему ваша привязка не работает: часть XmlAccessorType

Что касается вашей конкретной проблемы: в общем, вы должны сообщить JAXB, что и как привязать объект java к его XML-представлению. Если вы ничего не делаете, то по умолчанию все публичные члены вашего класса связаны (как вы можете прочитать здесь).

Кроме того, вы выбрали аннотирование метода получения вашего общедоступного члена, который затем просто дважды отправляет одну и ту же переменную в ваш XML, что позже вызывает исключение, которое вы видите.

Чтобы исправить ошибку, укажите другую стратегию сопоставления для вашего класса, например, (@XmlAccessorType(XmlAccessType.NONE)) перед объявлением класса или переместите аннотацию из метода получения в свойство.

Между прочим: наличие метода получения и общедоступной переменной-члена вообще не имеет смысла. Таким образом, создание частной переменной-члена также решит вашу проблему с JAXB и будет намного лучше для дизайна вашего класса.

person Matthias    schedule 28.10.2013
comment
Спасибо за ответ. Я помню, что я использую @XmlAccessorType (XmlAccessType.PROPERTY), поэтому он дублируется. Я редактирую его на @XmlAccessorType (XmlAccessType.NONE), дублированное исключение исправлено. Но дата снова равна нулю. Затем добавляю @XmlJavaTypeAdapter (DateAdapter.class) Все в порядке! Отлично! - person Ninja; 28.10.2013
comment
Ты так быстро печатаешь ... Все в порядке с твоим любезным предложением. Я мог бы снова подышать свежим воздухом - person Ninja; 28.10.2013

исключение четко говорит о том, что имя свойства дублируется, поэтому проверьте свой класс на свойство 'flightBaseDae', оно должно быть уникальным. удалите дубликат, затем разупорядочите его

person pappu_kutty    schedule 28.10.2013
comment
Хотя в исключении четко указано, что существует два свойства, причина в том, как JAXB выполняет маршалинг / демаршалинг XML и что он настроен здесь для демаршалинга одного и того же свойства дважды (один раз как общедоступная переменная-член и один раз как метод получения). - person Matthias; 28.10.2013
comment
круто .. я думал, что xml marshaller игнорирует аннотированный метод получения, даже если для accessType установлено значение PROPERTY. - person pappu_kutty; 28.10.2013