代码之家  ›  专栏  ›  技术社区  ›  BlueLettuce16

在XML和自定义绑定中具有匿名内部类型的JAXB ClassCastException

  •  1
  • BlueLettuce16  · 技术社区  · 6 年前

    <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>
    

    以及以下绑定.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>
    

    <shiporder>
      <item>
        <title>string1</title>
         <item>
          <note>string1</note>
         </item>
        </item>
    </shiporder>
    

    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();
        }
    }
    }
    

    我得到以下例外:


    你能帮我查出我在这里做错了什么吗?

    我应该以其他方式重写绑定吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   BlueLettuce16    6 年前

    我发现问题出在错误的绑定上 在结尾处丢失了。嵌套类型的绑定应如下所示:

    <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>