【问题标题】:JAXB 'date' conversions fail after moving from Java 5 SE to Java 6 SE从 Java 5 SE 迁移到 Java 6 SE 后,JAXB“日期”转换失败
【发布时间】:2013-01-08 20:56:31
【问题描述】:

我正在尝试将现有应用程序的 Java JDK 版本从 Java 5 更改为 Java 6(更新 38)。该应用程序使用一些 JAXB 生成的类来编组/解组我们从远程服务器发送/接收的 XML。 XML 符合架构 (.xsd) 文件。

这一切在 Java 5 下都可以正常工作,在类路径中下载 JAXB 二进制文件包。我不确定下载的 JAXB 二进制文件的版本是什么(这个项目在我之前就已经在这里了)。如果我只是将JDK版本从Java 5更改为Java 6(更新38),那么我会遇到一些以前从未发生过的单元测试失败,例如:

[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: '2012-08-22T00:00:00-04:00' is not a valid value for 'date'.]

我认为我可以通过将 Java 6 JDK 移动到类路径的头部来解决这个问题,因此它位于外部 JAXB 二进制文件之前。这会产生编译时错误,例如:

The attribute required is undefined for the annotation type XmlElementRef

在我的一个 JAXB 生成的类(基于 .xsd 文件)上报告了此错误。错误是由这个注释行引起的:

@XmlElementRef(name = "DealCalendarId", type = JAXBElement.class, required = false)

所以,我不确定接下来我需要做什么。我有几个想法:

  • 删除下载的 JAXB 二进制文件并仅依赖 Java 6 SE 中的内置 JAXB 支持(但我似乎记得前段时间这在项目中不起作用...)
  • 将下载的 JAXB 二进制文件替换为较新的版本
  • 将下载的 JAXB 二进制文件替换为较新版本,并将 Java 6 JDK 放在类路径中
  • 执行上述操作之一并重新生成我所有基于 .xsd 的 JAXB 类

有什么建议吗?

【问题讨论】:

    标签: java xsd jaxb


    【解决方案1】:

    问题 #1

    [org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: “2012-08-22T00:00:00-04:00”不是“日期”的有效值。]

    仅通过此消息 2012-08-22T00:00:00-04:00 不是 XML 架构 date 类型的有效值,如果没有时间信息,有效值将是 2012-08-22。您提供的值将对应于 dateTime 类型。您使用的其他版本可能无法执行此验证。

    问题 #2

    注解类型所需的属性未定义 XmlElementRef

    Java SE 6 包含 JAXB 2.1,您一定一直在将 JAXB 2.2 与 Java SE 5 一起使用,其中 @XmlElementRef 注释包含 required 属性。

    【讨论】:

    • 非常感谢您花时间帮助我 Blaise。我明天去办公室看看。
    • 在这两种情况下都是正确的。我不确定为什么旧版本的 JAXB 允许将这些时间戳解组为 xs:date,但确实如此。我修复了我的单元测试数据以删除时间组件,一切都很好。我下载了当前的 JAXB 版本(版本 2.2.6),一切似乎都运行良好。再次感谢!
    • 我相信你有绑定文件,它在日期时间 XML 数据类型上创建了一个适配器,我刚刚删除它,并再次生成 JAXB 类,java 数据类型从 Date 转换为 XMLGregorianType。
    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多