当前位置: 首页 > 知识库问答 >
问题:

xml中具有匿名内部类型和自定义绑定的Jaxb ClassCastException

朱承载
2023-03-14

我有以下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.ClassCastExcema: test.ShiporderItem$ShiporderItemItem不能强制转换为测试。ShiporderItem
在JaxbTest.main(JaxbTest.java:16)

你能帮我找出我做错了什么吗<我认为这里的一切都应该很好
我是否应该以其他方式重写绑定?

共有1个答案

花博厚
2023-03-14

我发现问题出在错误的绑定上 /xs:最后缺少了复杂类型。嵌套类型的绑定应该如下所示:

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

然后就没有了ClassCastExcure。

 类似资料:
  • 问题内容: 我已经看到了几个与Java中类似的示例,希望有人可以解释发生了什么。似乎可以内联定义一个新类,这对我来说真的很奇怪。 第一行是预期的输出行,因为它只是toString。但是第二似乎函数可以内联重写。 为此有技术术语吗? 还是任何更深入的文档? 如果我有以下代码: 代码输出: 问题答案: 它是一个匿名内部类。您可以在Java文档内部类链接中找到有关它的更多信息。 编辑 我正在添加一个更好

  • 本文向大家介绍Java中定义了几种类型的匿名内部类?,包括了Java中定义了几种类型的匿名内部类?的使用技巧和注意事项,需要的朋友参考一下 一个匿名内部类是声明一个内部类没有任何类名的。换句话说,一个无名的内部类称为匿名内部类。由于它没有名称,因此它不能具有构造函数, 因为我们知道构造函数名称与类名称相同。 我们可以定义一个匿名内部类,并一步一步使用new 运算符创建其对象。 语法 Java匿名内

  • 问题内容: 我正在使用具有继承性的流畅接口。我声明基类Constructor受保护,因此您不能创建Foo ,这会导致在调用add()时引发ClassCastException。但是我在返回一个新的Foo实例的静态方法上遇到了麻烦。 这主要是流利的接口,特定领域的语言和泛型方面的一项练习(个人而非家庭作业),所以请不要问我需要什么。 编辑:Eclipse错误 问题答案: 本质上,您有一个递归类型声明

  • 问题内容: 我正在编写C#Wicket实现,以加深对C#和Wicket的理解。我们遇到的问题之一是Wicket大量使用匿名内部类,而C#没有匿名内部类。 因此,例如,在Wicket中,您可以这样定义一个链接: 由于Link是一个抽象类,因此它强制实现者实现onClick方法。 但是,在C#中,由于没有匿名内部类,因此无法做到这一点。另外,您可以使用如下事件: 当然,这样做有两个缺点。首先,可以有多

  • 在中定义额外的方法(不重写超类方法)时,代码编译良好,没有任何问题,但如果我试图调用额外的方法,它会抛出错误。那么,在使用扩展时,是否只有在子类中的方法才可能?如果是这样,谁能解释一下为什么? 下面是我的代码的样子 这就是我得到的错误

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除