4

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

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

但是当我将 xml String 转换回实体时,一些信息会丢失(它们都具有相同的类型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”
    此问题与以下位置有关:
在公共 java.lang.String com.wonders.nlia.omms.vo.FlightServiceInfoVo.getFlightBaseDate()
在 com.wonders.nlia.omms.vo.FlightServiceInfoVo
    此问题与以下位置有关:
在公共 java.lang.String com.wonders.nlia.omms.vo.FlightServiceInfoVo.flightBaseDate
在 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 是一个字符串。

4

2 回答 2

1

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

我强烈建议您首先阅读该技术,因为存在很多陷阱。这是一个很好的教程的链接。以下是教程中解释绑定不起作用的部分:XmlAccessorType 部分

至于您的具体问题:一般来说,您必须告诉 JAXB 什么以及如何将 java 对象绑定到它的 XML 表示。如果你什么都不做,那么默认情况下你班级的所有公共成员都被绑定(你可以在这里阅读)。

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

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

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

于 2013-10-28T07:14:06.320 回答
0

异常清楚地表明属性名称是重复的,因此请检查您的属性类'flightBaseDae',它应该是唯一的。删除重复的然后解组它

于 2013-10-28T07:05:26.317 回答