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