使用JAXB将XML字符串中的日期解组为实体

时间:2013-10-28 06:47:02

标签: java xml jaxb unmarshalling

当我使用JAXB时,出现了问题。

我将实体转换为xml String,一切正常。

但是当我将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

我的Unmarshalling代码是:

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

flightServiceInfoVoXml是一个字符串。

2 个答案:

答案 0 :(得分:1)

您可以通过多种不同方式配置JAXB。您已选择注释来定义绑定(这没关系,请不要担心)。

我强烈建议您首先阅读有关该技术,因为存在很多陷阱。这是一个好的tutorial的链接。以下是教程中的部分,它解释了绑定无效的原因:XmlAccessorType part

至于你的具体问题: 通常,您必须告诉JAXB将java对象绑定到它的XML表示形式以及如何绑定它。如果您不做任何事情,那么默认情况下,您班级的所有公共成员都会受到约束(您可以阅读here)。

此外,您已选择注释公共成员的getter方法,然后将相同的变量两次推送到XML,稍后会导致您看到的异常。

要修复错误,请为您的类指定不同的映射策略,例如: (@XmlAccessorType(XmlAccessType.NONE))在您的类声明之前或将注释从getter方法移动到属性。

顺便说一句:拥有一个getter方法和一个public成员变量根本没有意义。因此,将您的成员变量设为私有也将解决您的JAXB问题,并为您的类设计做得更好。

答案 1 :(得分:0)

该例外明确表示属性名称是重复的,因此请检查您是否为属性'flightBaseDae'上课,它应该是唯一的。删除副本然后解组它