【问题标题】:Tell JAXB to unmarshal <xs:dateTime> to Date class using annotations告诉 JAXB 使用注释将 <xs:dateTime> 解组为 Date 类
【发布时间】:2010-10-17 13:40:00
【问题描述】:

将 JAXB 与 Java-First 结合使用时,java.util.Date 类型的字段/属性将被编组和解组为 xs:dateTime,并且一切都按预期工作。

但如果字段/属性的类型是 Object,JAXB 将 xs:dateTime 解组为 XMLGregorianCalendarImpl

我需要找到一种方法,让 JAXB 使用注释自行将日期时间值解组为 java.util.Date。否则,我需要检查每个用例中所有未编组的值。

即使在包含 Object 字段的类上定义一些 after-unmarshall-hook 并手动转换实例也会很好。但我也找不到任何可以这样使用的东西。

请注意,我对 JAXB 上下文的访问权限有限,因为它在 Apache CXF 中使用。

【问题讨论】:

    标签: java jaxb


    【解决方案1】:

    除了 Blaise Doughan 的回答:

    我终于可以解决这个问题了,感谢 Blaise Doughan 的帮助。实际上,他的回答只需稍作改动即可:如果有几种类型需要解组为 Object 属性,则需要使用 @XmlElements 注释在其上放置多个 @XmlElement 注释。

    这是我的代码:

    @XmlElements
            ({
                    @XmlElement(name = "dateValue",    type = Date.class),
                    @XmlElement(name = "stringValue",  type = String.class),
                    @XmlElement(name = "booleanValue", type = Boolean.class),
                    @XmlElement(name = "listValue",    type = ArrayList.class),
                    @XmlElement(name = "bytesValue",   type = Byte[].class)
            })
    public Object getFieldValue()
    {
        return fieldValue;
    }
    

    注意:为此需要指定“名称”,因为编组器/解组器应该有一种方法来识别内容的类型。

    这里有两个小问题:

    1. 您需要指定所有预期类型的​​列表(考虑到编组的情况,这是合乎逻辑的)

    2. 无法为此属性指定单个名称。在我的例子中,在 CXF Web 服务中使用 JAXB,从 .NET 中的 WSDL 生成的代码将此字段命名为“Item”。例如,如果有一种方法可以将 XML 元素包装在另一个具有单一名称的元素中,那么生成的代码可能会更好一些。

    【讨论】:

      【解决方案2】:

      您可以在@XmlElement 上设置类型属性。

      @XmlElement(type=Date.class)
      public Object getGenericDateProperty() {
          return date;
      }
      

      编辑:

      由于您不知道可以使用 XmlAdapter 的类型。如果未编组的值是 XMLGregorianCalendar,则将其转换为日期。有关 XmlAdapter 的更多信息,请参阅:

      【讨论】:

      • 对象并不总是一个日期。它可以是各种类型。在生成的 XSD 中,它被指定为 xs:anyType。日期是可能的值之一。
      • 您可以编写一个 XmlAdapter 来在日期类型之间进行转换。
      • 我有一个 XmlAdapter 用于在 XMLGregorianCalendar 和 Date 之间进行转换,但我不能使用 @XmlJavaTypeAdapter 将它应用于 Object 类型的字段 - 它会导致 IllegalAnnotationException。
      • 你可以试试 MOXy JAXB(我是技术主管)eclipse.org/eclipselink/moxy.php。明天有电脑的时候我自己试试看。
      • 您的第一个答案让我找到了解决方案,我现在将发布该解决方案。谢谢。对于您的最后一条评论,我宁愿不替换 JAXB 实现,因为它已被 CXF 使用,我不确定要替换多少令人头疼。
      猜你喜欢
      • 1970-01-01
      • 2011-12-20
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多