java - 告诉 JAXB 解码 <xs :dateTime> to Date class using annotations

标签 java jaxb

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

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

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

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

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

最佳答案

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

关于java - 告诉 JAXB 解码 <xs :dateTime> to Date class using annotations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3953433/

相关文章:

java - 后期绑定(bind)是这样吗?

java - 从 WSDL 生成的 JAXB POJO 使用起来似乎很麻烦

java - 支持使用 JAXB 进行 XSD 版本控制

java - JAXB 编码与 XSD 模式生成 - "desynchronize"it

java - 扫描仪显示异常 InputMisMatchException

java - 整数数组列表已更改java

java - 从 build.xml 调用时,linux 中的 jaxb schemagen 问题。找不到源文件?

java - 对具有多个父节点的唯一节点进行编码

java - 测试 Selenium ,测试问题

java - 无法将 CLOB 数据转换为字符串