xml 和自定义绑定中具有匿名内部类型的 Jaxb ClassCastException
Jaxb ClassCastException with anonymous inner type in xml and custom bindings
我有以下 xsd 文件:
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="item" minOccurs="0" nillable="true" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="item" minOccurs="0" nillable="true" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="note" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item">
<xs:complexType>
<xs:sequence>
<xs:element name="item" minOccurs="0" nillable="true" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="description"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
及以下bindings.xjb
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"> <jxb:globalBindings localScoping="toplevel">
<xjc:simple/>
</jxb:globalBindings>
<jxb:bindings schemaLocation="model.xsd">
<jxb:schemaBindings>
<jxb:package name="test"/>
</jxb:schemaBindings>
<jxb:bindings node="/xs:schema/xs:element[@name='shiporder']">
<jxb:class name="Shiporderrrr"/>
</jxb:bindings>
<jxb:bindings node="/xs:schema/xs:element[@name='shiporder']/xs:complexType/xs:sequence/xs:element[@name='item']/xs:complexType/xs:sequence/xs:element[@name='item']">
<jxb:class name="ShiporderItemItem"/>
</jxb:bindings>
<jxb:bindings node="/xs:schema/xs:element[@name='item']">
<jxb:class name="Item"/>
</jxb:bindings>
<jxb:bindings node="/xs:schema/xs:element[@name='item']/xs:complexType/xs:sequence/xs:element[@name='item']">
<jxb:class name="ItemItem"/>
</jxb:bindings>
</jxb:bindings>
我还有以下 xml 文件:
<shiporder>
<item>
<title>string1</title>
<item>
<note>string1</note>
</item>
</item>
</shiporder>
当我使用 jaxb 解组时生成 类:
import test.Shiporderrrr;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.nio.file.Paths;
public class JaxbTest {
public static void main(String[] args) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Shiporderrrr.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Shiporderrrr shiporder = (Shiporderrrr)unmarshaller.unmarshal(Paths.get("src/main/resources/model1.xml").toFile());
System.out.println(shiporder.getItems().get(0).getValue().getTitle());
} catch (Exception e) {
e.printStackTrace();
}
}
}
我得到以下异常:
java.lang.ClassCastException: test.ShiporderItem$ShiporderItemItem cannot be cast to test.ShiporderItem
at JaxbTest.main(JaxbTest.java:16)
你能帮我找出我做错了什么吗?
我认为这里的一切应该都能正常工作。
我应该用其他方式重写我的绑定吗?
我发现问题出在错误的绑定上 /xs:complexType 最后丢失了。嵌套类型的绑定应如下所示:
<jxb:bindings node="/xs:schema/xs:element[@name='item']/xs:complexType/xs:sequence/xs:element[@name='item']/xs:complexType">
<jxb:class name="ItemItem"/>
</jxb:bindings>
然后就没有ClassCastException了。
我有以下 xsd 文件:
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="item" minOccurs="0" nillable="true" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="item" minOccurs="0" nillable="true" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="note" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item">
<xs:complexType>
<xs:sequence>
<xs:element name="item" minOccurs="0" nillable="true" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="description"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
及以下bindings.xjb
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"> <jxb:globalBindings localScoping="toplevel">
<xjc:simple/>
</jxb:globalBindings>
<jxb:bindings schemaLocation="model.xsd">
<jxb:schemaBindings>
<jxb:package name="test"/>
</jxb:schemaBindings>
<jxb:bindings node="/xs:schema/xs:element[@name='shiporder']">
<jxb:class name="Shiporderrrr"/>
</jxb:bindings>
<jxb:bindings node="/xs:schema/xs:element[@name='shiporder']/xs:complexType/xs:sequence/xs:element[@name='item']/xs:complexType/xs:sequence/xs:element[@name='item']">
<jxb:class name="ShiporderItemItem"/>
</jxb:bindings>
<jxb:bindings node="/xs:schema/xs:element[@name='item']">
<jxb:class name="Item"/>
</jxb:bindings>
<jxb:bindings node="/xs:schema/xs:element[@name='item']/xs:complexType/xs:sequence/xs:element[@name='item']">
<jxb:class name="ItemItem"/>
</jxb:bindings>
</jxb:bindings>
我还有以下 xml 文件:
<shiporder>
<item>
<title>string1</title>
<item>
<note>string1</note>
</item>
</item>
</shiporder>
当我使用 jaxb 解组时生成 类:
import test.Shiporderrrr;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.nio.file.Paths;
public class JaxbTest {
public static void main(String[] args) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Shiporderrrr.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Shiporderrrr shiporder = (Shiporderrrr)unmarshaller.unmarshal(Paths.get("src/main/resources/model1.xml").toFile());
System.out.println(shiporder.getItems().get(0).getValue().getTitle());
} catch (Exception e) {
e.printStackTrace();
}
}
}
我得到以下异常:
java.lang.ClassCastException: test.ShiporderItem$ShiporderItemItem cannot be cast to test.ShiporderItem
at JaxbTest.main(JaxbTest.java:16)
你能帮我找出我做错了什么吗?
我认为这里的一切应该都能正常工作。
我应该用其他方式重写我的绑定吗?
我发现问题出在错误的绑定上 /xs:complexType 最后丢失了。嵌套类型的绑定应如下所示:
<jxb:bindings node="/xs:schema/xs:element[@name='item']/xs:complexType/xs:sequence/xs:element[@name='item']/xs:complexType">
<jxb:class name="ItemItem"/>
</jxb:bindings>
然后就没有ClassCastException了。