【问题标题】:Troubles converting XSD to Java using JAXB使用 JAXB 将 XSD 转换为 Java 的问题
【发布时间】:2013-04-04 22:35:21
【问题描述】:

我正在尝试使用 JAXB 将我无法控制的 XSD 转换为 Java 类。我得到的错误是:

[ERROR] cvc-pattern-valid: Value 'true' is not facet-valid with respect to pattern '0|1' for type 'BooleanType'.
  line 139 of http://neon/meaweb/schema/common/meta/MXMeta.xsd

[ERROR] a-props-correct.2: Invalid value constraint value '1' in attribute 'mxencrypted'.
  line 139 of http://neon/meaweb/schema/common/meta/MXMeta.xsd

XSD 中包含错误的代码在:

  <xsd:complexType name="MXCryptoType">
    <xsd:simpleContent>
      <xsd:extension base="xsd:base64Binary">
        <xsd:attribute name="changed" type="ChangeIndicatorType" use="optional" />
        <xsd:attribute name="mxencrypted" type="BooleanType" use="optional" default="1" />
      </xsd:extension>
    </xsd:simpleContent>

具体来说,它是使用 BooleanType 进行 mxencrypted 的属性。 BooleanType 定义为

  <xsd:simpleType name="BooleanType">
    <xsd:restriction base="xsd:boolean">
      <xsd:pattern value="0|1" />
    </xsd:restriction>
  </xsd:simpleType>

通过搜索这似乎是一种常见的情况。据我所知,mxencrypted 行中的默认值不应该是 1?当我将 XSD 加载到 Liquid XML 中时,架构不会报告错误。在此处验证 XSD (http://www.utilities-online.info/xsdvalidation/#.UV3zkL_EW0s) 会报告与 JAXB 相同的错误。

有没有办法告诉 JAXB 忽略这个问题,只生成忽略默认值的类?

【问题讨论】:

    标签: xsd jaxb


    【解决方案1】:

    您的问题类似于this one(我刚刚更新了相关信息)。我不知道有一种方法可以告诉 JAXB 忽略它,因为此错误发生在 XSD 模式处理器中(在 JAXB 的 xjc 开始实际工作之前)。

    唯一的办法可能是过滤掉默认属性;但是,在这种情况下,很明显 XSD 设计器打算使用默认值 true,而生成的代码并非如此(Java 默认为 false)。

    这可能会产生不必要的争吵,我的建议是与 XSD 提供商合作修复它。

    也许是一个侧边栏,但我个人认为在 XSD 中使用默认值是一个互操作性怪物:任何不依赖 XSD 的 XML 处理器的行为都会与依赖 XSD 的处理器不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多