Демаршалинг на дата от XML низ към обект с помощта на JAXB

Когато използвам JAXB, има нещо нередно.

Преобразувам обект в xml низ и всичко е наред.

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

В обект:
public Date flightBaseDate;

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

след демаршалиране, getFlightBaseDate() връща null.

Търсих в Google.
Следвайки едно предложение, използвах @ в моя обект.
Тогава това е:

@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 представяне. Ако не направите нищо, тогава по подразбиране всички публични членове на вашия клас са обвързани (както можете да прочетете тук).

Освен това сте избрали да анотирате метода getter на вашия публичен член, който след това просто избутва същата променлива два пъти към вашия XML, което по-късно причинява изключението, което виждате.

За да коригирате грешката си, или задайте различна стратегия за картографиране за вашия клас, като поставите напр. (@XmlAccessorType(XmlAccessType.NONE)) преди декларацията на вашия клас или преместете анотацията от метода getter към свойството.

Между другото: наличието на метод за получаване и публична членска променлива изобщо няма смисъл. Така че правенето на вашата членска променлива частна също ще коригира проблема ви с 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