使用JAXB将XSD转换为Java的麻烦

时间:2013-04-04 22:35:22

标签: xsd jaxb

我正在尝试使用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忽略这个问题,只是生成忽略默认值的类?

1 个答案:

答案 0 :(得分:0)

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

唯一的方法是过滤掉默认属性;但是,在这种情况下,显然XSD设计器的默认值为true,而生成的代码则不然(Java默认为false)。

这可能会产生不必要的骚扰,我的建议是与XSD提供商合作以解决问题。

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