Ninja
Ninja

Reputation: 2568

Unmarshalling a date from an XML String to entity using JAXB

When I use JAXB, there is something wrong.

I convert entity to a xml String and everything is ok.

But when I convert xml String back to entity, some information is lost (All of them have the same type java.util.Date).

In entity:
public Date flightBaseDate;

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

after unmarshalling, getFlightBaseDate() returns null.

I googled.
Following one suggestion, I used @ in my entity.
Then it is:

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

I'm sure it will be perfect,
but...throws Exception, like this:

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

Why JAXB could not distinguish between the property and its getMethod?

How to solve it?

Platform:jdk7 win7 eclipse tomcat wtp

My Unmarshalling code is:

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

flightServiceInfoVoXml is a String.

Upvotes: 4

Views: 1868

Answers (2)

Matthias
Matthias

Reputation: 3592

You can configure JAXB in many different ways. You have chosen Annotations to define the binding (this is allright, do not worry).

I strongle recommend you read about that technique first as there are a lot of pitfalls. Here is a link to a good tutorial. Here is the part in the tutorial which explains why your binding does not work: XmlAccessorType part

As for your specific issue: In general you have to tell JAXB what and how to bind the java object to it's XML representation. If you do not do anything, then by default all public members of your class are bound (as you can read here).

Additionally you have chosen to annotate the getter method of your public member, which then just pushes the same variable twice to your XML which later causes the exception you see.

To fix your error, either specify a different mapping strategy for your class by putting e.g. (@XmlAccessorType(XmlAccessType.NONE)) before your class declaration or move the annotation from the getter method to the property.

By the way: Having a getter method and a public member variable does not make sense at all. So making your member variable private will also fix your issue with JAXB and be a lot better for your class design.

Upvotes: 1

pappu_kutty
pappu_kutty

Reputation: 2488

the exception clearly says that the property name is duplicated, so check you class for a property 'flightBaseDae', it should be unique. remove the duplicate then unmarshall it

Upvotes: 0

Related Questions