JiBX生成忽略属性名称空间的绑定

时间:2015-08-04 10:25:10

标签: java xsd code-generation jibx

我有以下架构(片段):

<xs:complexType name="partnerPaymentsItemType">
    <xs:sequence>
        <xs:element name="changeTime" type="dateTime"/>
        <xs:element name="statusId" type="shortId"/>
        <xs:element name="paymentPointId" type="shortString"/>
        <xs:element name="money" type="currency"/>
        <xs:element name="paymentDestination" type="shortString"/>
        <xs:element name="paymentDestinationType" type="shortId"/>
        <xs:element name="subagentId" type="shortId" minOccurs="0"/>
        <xs:element name="discountCardNumber" type="xs:string" minOccurs="0"/>
        <xs:element name="amountAll" type="currency" minOccurs="0"/>
        <xs:element name="rewardPercent" type="percentAmount" minOccurs="0"/>
        <xs:element name="rewardPercentValue" type="percentAmount" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="paymentTime" use="required" type="dateTime"/>
    <xs:attribute name="externalId" use="required" type="id"/>
    <xs:attribute name="registeredId" use="required" type="id"/>
</xs:complexType>

我使用JibX Codegen工具从中生成源代码,然后编译应该允许我将XML解组为Java对象的绑定。这是我的codegen设置:

<schema-set xmlns:xs="http://www.w3.org/2001/XMLSchema"
        delete-annotations="true"
        prefer-inline="false"
        generate-all="true"
        show-schema="true"
        type-substitutions="xs:date xs:string"
        package="here.lays.my.package">
    <class-decorator     class="org.jibx.schema.codegen.extend.SerializableDecorator"/>
</schema-set>

稍后,我尝试解析一个XML文档,该文档具有标记和属性的名称空间前缀,这导致例外

  

缺少必需属性“paymentTime”

通过JiBX源调试显示它试图查找没有命名空间的属性并在文档中命名为“paymentTime”,而文档的属性具有映射到URL的命名空间,当然也无法找到它。 / p>

我已经使用JAD反编译绑定,并使用null命名空间搜索属性:

public static PartnerPaymentsItemType JiBX_beeline_binding_unmarshalAttr_1_93(PartnerPaymentsItemType arg1, UnmarshallingContext arg2)
    throws JiBXException
{
    arg2.pushTrackedObject(arg1);
    arg1;
    arg1.setPaymentTime(arg2.attributeText(null, "paymentTime"));
    arg1.setExternalId(Utility.parseLong(WhitespaceConversions.trim(arg2.attributeText(null, "externalId"))));
    arg1.setRegisteredId(Utility.parseLong(WhitespaceConversions.trim(arg2.attributeText(null, "registeredId"))));
    arg2.popObject();
    return arg1;
}

我将非常感谢有助于解决问题的任何建议 - 例如,为什么JiBX生成了这样的映射,如何使其尊重属性命名空间等等。

1 个答案:

答案 0 :(得分:0)

JiBX行为实际上是正确的,属性的名称空间前缀不是基于xsd。

实际的解决方案是用XJC / JAXB替换JiBX,并为需要名称空间前缀的实体分离模式。