当我使用JAXB时,出现了问题。
我将实体转换为xml String,一切正常。
但是当我将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 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是一个字符串。
答案 0 :(得分:1)
您可以通过多种不同方式配置JAXB。您已选择注释来定义绑定(这没关系,请不要担心)。
我强烈建议您首先阅读有关该技术,因为存在很多陷阱。这是一个好的tutorial的链接。以下是教程中的部分,它解释了绑定无效的原因:XmlAccessorType part
至于你的具体问题: 通常,您必须告诉JAXB将java对象绑定到它的XML表示形式以及如何绑定它。如果您不做任何事情,那么默认情况下,您班级的所有公共成员都会受到约束(您可以阅读here)。
此外,您已选择注释公共成员的getter方法,然后将相同的变量两次推送到XML,稍后会导致您看到的异常。
要修复错误,请为您的类指定不同的映射策略,例如: (@XmlAccessorType(XmlAccessType.NONE)
)在您的类声明之前或将注释从getter方法移动到属性。
顺便说一句:拥有一个getter方法和一个public成员变量根本没有意义。因此,将您的成员变量设为私有也将解决您的JAXB问题,并为您的类设计做得更好。
答案 1 :(得分:0)
该例外明确表示属性名称是重复的,因此请检查您是否为属性'flightBaseDae'
上课,它应该是唯一的。删除副本然后解组它