【问题标题】:How can I set generateElementProperty as a local property in the bindings file如何将 generateElementProperty 设置为绑定文件中的本地属性
【发布时间】:2014-01-06 20:08:14
【问题描述】:

我遇到了关于 jaxb 的问题。我的元素之一是要求我设置JAXBElement&lt;String&gt;,而不仅仅是String。我知道解决这个问题的方法是更改​​ xsd,正如这里所讨论的 JAXB generating JAXBElement<String> instead of String,但 xsd 是由供应商提供的,我们无法说服他们更改它。

显然另一种解决方案是指定一个属性&lt;jaxb:globalBindings generateElementProperty="false"&gt;,这将全局关闭JAXBElements,这也不是我们想要的。

根据this page,应该可以在&lt;jaxb:property&gt; 自定义中本地设置generateElementProperty="false"。我怎样才能在绑定文件中做到这一点?我能找到的唯一示例(如this)似乎是直接在xsd 中设置它——如果我可以改变它,我只需删除minOccurs。

我当前的绑定文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<jxb:bindings version="1.0" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema" jxb:extensionBindingPrefixes="xjc" xmlns:jxb="http://java.sun.com/xml/ns/jaxb">
  <jxb:bindings schemaLocation="../XXXPrivateService.xsd" node="/xs:schema">
    <jxb:globalBindings>
      <xjc:noValidator />
      <xjc:serializable />
    </jxb:globalBindings>
    <jxb:schemaBindings>
      <jxb:package name="com.XXX.YYYY.xsd.XXXprivateservice">
        <jxb:javadoc><![CDATA[<body>TODO</body>]]></jxb:javadoc>
      </jxb:package>
    </jxb:schemaBindings>
  </jxb:bindings>

  <jxb:bindings schemaLocation="../XXXPrivateService_1_2.xsd" node="/xs:schema">
    <jxb:schemaBindings>
      <jxb:package name="com.XXX.YYYY.xsd.XXXprivateservice.two">
        <jxb:javadoc><![CDATA[<body>TODO</body>]]></jxb:javadoc>
      </jxb:package>
    </jxb:schemaBindings>
  </jxb:bindings>

  <jxb:bindings schemaLocation="../XXXPrivateService_1_2_3.xsd" node="/xs:schema">
    <jxb:schemaBindings>
      <jxb:package name="com.XXX.YYYY.xsd.XXXprivateservice.three">
        <jxb:javadoc><![CDATA[<body>TODO</body>]]></jxb:javadoc>
      </jxb:package>
    </jxb:schemaBindings>
  </jxb:bindings>

    <jxb:bindings schemaLocation="../XXXPrivateService_1_2_3_4.xsd" node="/xs:schema">
    <jxb:schemaBindings>
      <jxb:package name="com.XXX.YYYY.xsd.XXXprivateservice.four">
        <jxb:javadoc><![CDATA[<body>TODO</body>]]></jxb:javadoc>
      </jxb:package>
    </jxb:schemaBindings>
  </jxb:bindings>


  <jxb:bindings schemaLocation="../XXXPrivateService_1_2_3_4_5.xsd" node="/xs:schema">
    <jxb:schemaBindings>
      <jxb:package name="com.XXX.YYYY.xsd.XXXprivateservice.five">
        <jxb:javadoc><![CDATA[<body>TODO</body>]]></jxb:javadoc>
      </jxb:package>
    </jxb:schemaBindings>
  </jxb:bindings>

  <jxb:bindings schemaLocation="../XXXPrivateService_1_2_3_4_5_6.xsd" node="/xs:schema">
    <jxb:schemaBindings>
      <jxb:package name="com.XXX.YYYY.xsd.XXXprivateservice.six">
        <jxb:javadoc><![CDATA[<body>TODO</body>]]></jxb:javadoc>
      </jxb:package>
    </jxb:schemaBindings>
  </jxb:bindings>

  <jxb:bindings schemaLocation="../XXXPrivateService_1_2_3_4_5_6_7.xsd" node="/xs:schema">
    <jxb:schemaBindings>
      <jxb:package name="com.XXX.YYYY.xsd.XXXprivateservice.seven">
        <jxb:javadoc><![CDATA[<body>TODO</body>]]></jxb:javadoc>
      </jxb:package>
    </jxb:schemaBindings>
  </jxb:bindings>

</jxb:bindings>

XSD 的违规部分如下所示:

  <xs:element name="PayWithPointsRedemption">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="requestSourceId" type="xs:unsignedInt"/>
        <xs:element minOccurs="0" name="rewardsAccountId" type="xs:unsignedInt"/>
        <xs:element minOccurs="0" name="XXXReferenceId" nillable="true" type="xs:string"/>
        <xs:element minOccurs="0" name="externalChannelCode" nillable="true" type="xs:string"/>
        <xs:element minOccurs="0" name="payWithPointsRedemptionDetails" nillable="true" type="q4:ArrayOfPayWithPointsRedemptionDetail" xmlns:q4="http://ZZZZZ.YYYY.com/XXXRewards"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

【问题讨论】:

    标签: java xml jaxb xsd wsdl


    【解决方案1】:

    您应该可以像这样在外部绑定中本地设置它

    <jxb:bindings schemaLocation="xyz.xsd"
        node="/xs:schema">
        <jxb:schemaBindings>
            <!-- ... -->
        </jxb:schemaBindings>
        <jxb:bindings
            node="/xs:schema/xs:element[@name='PayWithPointsRedemption']/xs:complexType/xs:sequence">
            <jxb:property generateElementProperty="false" />
        </jxb:bindings>
    </jxb:bindings>
    

    确保jxb:bindings 中的XPath 表达式匹配!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2023-03-03
      • 2021-09-28
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多