0

JAXB Web サービスで着信 XML の検証を有効にした後、Invalid index -1.

このエラーがいつ発生するかを確認しました。オブジェクトを送信していますが、その 1 つのフィールドは抽象型です。このフィールドが null の場合、検証はパスします。このオブジェクトが送信されると、どのフィールドが設定されていてもエラーが発生します...

抽象型の定義:

<xs:complexType abstract="true" name="Customer">
<xs:sequence>
<xs:element minOccurs="0" name="id" type="xs:long"/>
<xs:element minOccurs="0" name="address" type="tns:Address"/>
<xs:element minOccurs="0" name="nip" type="xs:string"/>
<xs:element minOccurs="0" name="type" type="xs:string"/>
</xs:sequence>
</xs:complexType>

具体的な型の定義:

<xs:complexType name="PersonalCustomer">
<xs:complexContent>
<xs:extension base="tns:Customer">
<xs:sequence>
<xs:element minOccurs="0" name="PESEL" type="xs:string"/>
<xs:element minOccurs="0" name="firstName" type="xs:string"/>
<xs:element minOccurs="0" name="surname" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

CXF 起動時に WSDL が生成されるクラス定義 (抜粋):

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Customer", namespace = "http://dto.sample.pl/")
@XmlSeeAlso({ PersonalCustomer.class,
        CompanyCustomer.class })
public abstract class Customer implements Serializable {

    /** The Constant serialVersionUID. */
    private static final long serialVersionUID = 1L;

    private Long id;

    private Address address = new Address();

    private String nip;

    private String type;
}   

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "PersonalCustomer", namespace = "http://dto.sample.pl/")
public class PersonalCustomer extends Customer {

    /** The Constant serialVersionUID. */
    private static final long serialVersionUID = 1L;

    /** The PESEL. */
    private String PESEL;

    /** The first name. */
    private String firstName;

    /** The surname. */
    private String surname;
}

このエラーは、XML 内の URI を解決するときにスローされた例外から発生します。

Caused by: java.lang.IllegalArgumentException: Invalid index -1; current element has only 1 attributes
 at com.ctc.wstx.sr.AttributeCollector.throwIndex(AttributeCollector.java:457)[88:woodstox-core-asl:4.0.8]
 at com.ctc.wstx.sr.NsAttributeCollector.getURI(NsAttributeCollector.java:305)[88:woodstox-core-asl:4.0.8]
 at com.ctc.wstx.sr.BasicStreamReader.getAttributeNamespace(BasicStreamReader.java:585)[88:woodstox-core-asl:4.0.8]
 at org.apache.cxf.staxutils.DepthXMLStreamReader.getAttributeNamespace(DepthXMLStreamReader.java:63)[138:org.apache.cxf.bundle:2.3.3.fuse-01-09]
 at javax.xml.stream.util.StreamReaderDelegate.getAttributeNamespace(StreamReaderDelegate.java:112)[67:org.apache.servicemix.specs.stax-api-1.0:1.7.0]
 at org.apache.cxf.jaxb.JAXBEncoderDecoder$AddXSITypeStreamReader.getAttributeNamespace(JAXBEncoderDecoder.java:123)[138:org.apache.cxf.bundle:2.3.3.fuse-01-09]
 at org.apache.cxf.staxutils.DepthXMLStreamReader.getAttributeNamespace(DepthXMLStreamReader.java:63)[138:org.apache.cxf.bundle:2.3.3.fuse-01-09]
 at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector$1.getURI(StAXStreamConnector.java:254)[68:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_1]
 at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.fillXMLAttribute(ValidatorHandlerImpl.java:784)[:1.6.0_29]
 at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.fillXMLAttributes(ValidatorHandlerImpl.java:764)[:1.6.0_29]
 at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.startElement(ValidatorHandlerImpl.java:546)[:1.6.0_29]
 at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:96)[68:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_1]
 at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:242)[68:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_1] 

その定義に何か問題がありますか?このような謎めいたメッセージの検証エラーの正確な原因は何ですか?

4

0 に答える 0