JAXB未正确解组可选的Long元素(SAXParseException2:对于输入字符串:“”)

时间:2018-08-09 14:02:17

标签: jaxb cxf

我发现了类似的问题,但是某些条件不适用于我的情况,或者答案不起作用。

我创建了一个CXF(3.2.1)SOAP客户端来使用外部Web服务,因此我无法控制WSDL和模式。

服务模式的相关部分(不是整个模式)是:

<xsd:complexType name="LegalEntityService1">
    <xsd:annotation>
    <xsd:appinfo source="http://xmlns.oracle.com/adf/svc/metadata/">
    <key xmlns="http://xmlns.oracle.com/adf/svc/metadata/">
    <attribute>LegalEntityId</attribute>
    </key>
    </xsd:appinfo>
    </xsd:annotation>
    <xsd:sequence>
    <xsd:element minOccurs="0" name="LegalEntityId" type="xsd:long" sdoXML:dataType="sdoJava:LongObject"/>
    <xsd:element minOccurs="0" name="PartyId" type="xsd:long" sdoXML:dataType="sdoJava:LongObject"/>
    <xsd:element minOccurs="0" name="LegalEntityIdentifier" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="Name" type="xsd:string"/>
    <xsd:element default="1" minOccurs="0" name="GeographyId" type="xsd:long" sdoXML:dataType="sdoJava:LongObject"/>
    <xsd:element minOccurs="0" name="TransactingEntityFlag" nillable="true" type="xsd:boolean"/>
    <xsd:element minOccurs="0" name="EffectiveFrom" nillable="true" type="ns0:date-Date"/>
    <xsd:element minOccurs="0" name="EffectiveTo" nillable="true" type="ns0:date-Date"/>
    <xsd:element minOccurs="0" name="ObjectVersionNumber" type="xsd:int" sdoXML:dataType="sdoJava:IntObject"/>
    <xsd:element minOccurs="0" name="ActivityCode" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="SubActivityCode" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="TypeOfCompany" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="RegistrationCodeLe" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="RegistrationCodeEtb" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="RegistrationCodeLeValue" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="RegistrationCodeEtbValue" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="JurisdictionName" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="PlaceOfRegistration" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="LegalEmployerFlag" nillable="true" type="xsd:boolean"/>
    <xsd:element minOccurs="0" name="ParentPsuId" nillable="true" type="xsd:long"/>
    <xsd:element minOccurs="0" name="PsuFlag" nillable="true" type="xsd:boolean"/>
    <xsd:element minOccurs="0" name="JurisdictionId" nillable="true" type="xsd:long"/>
    <xsd:element minOccurs="0" name="GeographyId1" type="xsd:long" sdoXML:dataType="sdoJava:LongObject"/>
    <xsd:element minOccurs="0" name="TerritoryShortName" type="xsd:string"/>
    <xsd:element minOccurs="0" name="TerritoryCode" type="xsd:string"/>
    <xsd:element minOccurs="0" name="Country" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="LegalAddress" type="xsd:string"/>
    <xsd:element minOccurs="0" name="Name1" type="xsd:string"/>
    <xsd:element minOccurs="0" name="LegalEntityId1" type="xsd:long" sdoXML:dataType="sdoJava:LongObject"/>

我特别遇到以下问题:

<xsd:element minOccurs="0" name="LegalEntityId1" type="xsd:long" sdoXML:dataType="sdoJava:LongObject"/>

它是minOccurs = 0,因此它应该允许一个空标签,但是当它将以下响应解组时,它会失败,并出现 javax.xml.ws.soap.SOAPFaultException:解组错误:对于输入字符串:“”

注释似乎是正确的,因为它是 required = false

@XmlElementRef(name = "LegalEntityId1", namespace = "http://xmlns.oracle.com/apps/financials/legalEntity/legalEntities/legalEntityService/", type = JAXBElement.class, required = false)
protected JAXBElement<Long> legalEntityId1;

我不明白为什么它失败了。我知道问题是LegalEntityId1,因为我已通过调试器对其进行了检查。

编辑#1 这是整个堆栈跟踪https://pastebin.com/jS9Pu4rB

1 个答案:

答案 0 :(得分:0)

此问题归因于元素的类型。

<LegalEntityId1></LegalEntityId1>不是长格式,因为它被解析为""空字符串。 如果您需要的是“ null” 的含义,则xml中的“ nil” 应该更改<xsd:element minOccurs="0" name="LegalEntityId1" type="xsd:long" nillable="true" />中的xsd,即xml中的{{1 }}。