代码之家  ›  专栏  ›  技术社区  ›  Iravanchi

告诉JAXB使用注释取消标记<xs:datetime>结束日期类

  •  6
  • Iravanchi  · 技术社区  · 15 年前

    当首先使用JAXB时,类型的字段/属性 java.util.Date 被编组和解编为 xs:dateTime 一切正常。

    但如果字段/属性的类型为 Object ,JAXB取消标记 日期时间 XMLGregorianCalendarImpl .

    我需要找到一种方法让jaxb将日期时间值取消标记为 日期类型 使用注释。否则,我需要在每个用例中检查所有未编排的值。

    即使在包含对象字段的类上有一些unmarshall钩子来定义,手动转换实例也是不错的。但我也找不到任何可以这样使用的东西。

    注意,我对JAXB上下文的访问是有限的,因为它在ApacheCXF中使用。

    2 回复  |  直到 15 年前
        1
  •  4
  •   bdoughan    15 年前

    可以在@xmlement上设置type属性。

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

    编辑:

    因为您不知道可以使用XML适配器的类型。如果未合并的值是xmlGregorianCalendar,请将其转换为日期。有关XML适配器的详细信息,请参阅:

        2
  •  6
  •   Iravanchi    15 年前

    除了Blaise Doughan的回答:

    我终于明白了,谢谢布莱斯·道格汉的帮助。实际上,他的答案只需要一个小小的改变:如果有几个类型需要作为对象属性进行解组,那么需要有多个类型 @XmlElement 使用 @XmlElements 注释。

    下面是我的代码:

    @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元素包装在另一个只有一个名称的元素中,那么生成的代码可能会更好一些。