当前位置: 首页 > 知识库问答 >
问题:

使用JAXB将日期从XML字符串解组到实体

史景铄
2023-03-14

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

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

但当我将xml字符串转换回实体时,一些信息丢失了(它们都具有相同的类型java.util.Date)。

在实体中:
公共日期flightBaseDate

在xml中:

解组后,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

我的解组代码是:

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

flightServiceInfoVoXml是一个字符串。


共有2个答案

齐磊
2023-03-14

异常清楚地说属性名称是重复的,所以检查你的类是否有属性'flight BaseDae',它应该是唯一的。删除重复的,然后取消它

百里承业
2023-03-14

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

我建议你先读一下这项技术,因为有很多陷阱。这里是一个好教程的链接。以下是本教程中解释绑定不起作用的部分:XmlAccessorType部分

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

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

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

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

 类似资料:
  • 问题解决 将XmlElementRef注释更改为@XmlElementRef(name=“Option”,type=Option.class,required=false)后,将@XmlRootElement(name=“Option”)添加到选项中。班 更新: 根据laune的建议,我添加了两个类(Options和Option),并修改了GuimopProperties类,如下所示 但当我必须新

  • 问题内容: 我在这里有点迷路,我认为我一切都很好,但仍然无法正常工作(PaseException 帮助高度赞赏! 问题答案: 对我来说很好。 也许你可以尝试

  • 问题内容: 如何使用下面的代码解组XML字符串并将其映射到下面的JAXB对象? 问题答案: 要传递XML内容,您需要将内容包装在中,然后将其解组:

  • 我必须在JAXB中将xml解析为字符串对象。但是如何为这个xml创建对象 Country.xml 为了解析这个xml,我创建了一个类来映射对象,它创建对象并在控制台中打印出来。却不知道自己做错了什么。 当我运行程序时,我会得到 com . sun . XML . internal . bind . v2 . runtime . illegalanotationexception:illegalan

  • 问题内容: 在Android应用程序中,我试图从字符串中解析日期,以发现两次之间的差异。 因此,我必须进行解析,以便获得格式,因此 但是我到了 所以我在做什么错了?如何在这里解析? 问题答案: 您需要将第二个MM(月)更改为mm(分钟):

  • 问题内容: 我试图解析一个日期字符串,它是FTP服务器上文件的修改日期。以下是代码。 我在日志中得到这个 谁能帮我这个忙吗? 问题答案: String#substring(int index) 方法的javadoc 说: 子字符串以指定索引处的字符开头,并扩展到该字符串的末尾。 这就是您遇到的问题:您没有正确使用该方法,因为调用该方法时,您会收到另一个,该字符包含一个空格作为第一个字符,这就是解析