Jaxb ClassCastException с анонимным внутренним типом в xml и пользовательскими привязками - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующий 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>

и следующие привязки.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 не может быть приведен к test.ShiporderItem
на JaxbTest.main (JaxbTest.java:16)

Не могли бы вы помочь мне узнать, что я здесь не так делаю?
Я думаю, что все здесь должно работать нормально.
Должен ли я переписать свои привязки другим способом?

1 Ответ

0 голосов
/ 03 июля 2018

Я обнаружил, что проблема была в неправильных привязках / 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.

...