使用JAXB将日期从XML字符串反序列化为实体

4

我在使用JAXB时,遇到了一些问题。

我将实体转换为xml字符串,一切正常。

但是当我将xml字符串转换回实体时,一些信息丢失了(它们全部属于相同的类型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个IllegalAnnotationExceptions计数
类有两个相同名称的属性“flightBaseDate”
    此问题与以下位置相关:
public java.lang.String com.wonders.nlia.omms.vo.FlightServiceInfoVo.getFlightBaseDate()
在com.wonders.nlia.omms.vo.FlightServiceInfoVo处
    此问题与以下位置相关:
public java.lang.String com.wonders.nlia.omms.vo.FlightServiceInfoVo.flightBaseDate
在com.wonders.nlia.omms.vo.FlightServiceInfoVo处
为什么JAXB不能区分属性和其get方法?
如何解决?
平台: jdk7 win7 eclipse tomcat wtp 我的Unmarshalling代码是:
JAXBContext context = JAXBContext.newInstance(FlightServiceInfoVo.class);
    Unmarshaller unMarshaller = context.createUnmarshaller();  
    FlightServiceInfoVo flightServiceInfoVo =(FlightServiceInfoVo)unMarshaller.unmarshal(new StringReader(flightServiceInfoVoXml));    

flightServiceInfoVoXml 是一个字符串。

2个回答

1
您可以以多种不同的方式配置JAXB。您选择使用注释来定义绑定(这很好,不用担心)。
我强烈建议您先阅读有关该技术的信息,因为存在许多陷阱。这是一个好的tutorial链接。这是教程中解释为什么您的绑定无法工作的部分XmlAccessorType part
至于您的具体问题: 通常,您必须告诉JAXB将Java对象绑定到其XML表示形式的内容和方式。如果您什么都不做,则默认情况下会绑定类的所有公共成员(您可以在here中阅读)。
此外,您选择注释公共成员的getter方法,然后只是将相同的变量推送两次到您的XML中,这之后会导致您看到的异常。
为了解决您的错误,请在类声明之前加上例如 (@XmlAccessorType(XmlAccessType.NONE)) 以指定不同的映射策略,或将注释从getter方法移到属性中。
顺便说一下:拥有getter方法和公共成员变量完全没有意义。因此,将成员变量设为私有也可以解决JAXB的问题,并且对于您的类设计来说更好。

谢谢你的回答。我记得我使用了@XmlAccessorType(XmlAccessType.PROPERTY),所以它是重复的。我将其编辑为@XmlAccessorType(XmlAccessType.NONE),解决了重复异常问题。但是日期又变成了null。然后我添加了@XmlJavaTypeAdapter(DateAdapter.class)。一切都好了!完美! - Ninja
你打字速度真快... 你的建议非常好,一切都没问题了。我又可以呼吸新鲜空气了。 - Ninja

0

异常明确指出属性名称重复了,因此请检查您的类是否有一个名为'flightBaseDae'的属性,它应该是唯一的。删除重复项,然后进行反序列化操作。


2
虽然异常明确指出有两个属性,但原因在于JAXB如何编组/解组XML以及它在此处配置为将同一属性解组两次(一次作为公共成员变量,一次作为getter方法)。 - Matthias
很酷,我以为XML Marshaller会忽略已注释的getter方法,即使accessType设置为PROPERTY。 - pappu_kutty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接