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

JAXB继承-非抽象基类

翟宾实
2023-03-14

我目前正在尝试使用JaxB,但对于一个相对简单的示例,我并不是很成功。我的示例如下:

public class A {
   private String m_name;
}

public abstract class B_Base extends A {

}

public class B1 extends B_Base {
   private String m_value1;
}

public class B2 extends B_Base {
   private String m_value2;
}

我所有的尝试(甚至编组)都失败了。我浏览了BlaiseDoughan的博客,包括http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html但他们似乎对我的例子都没有帮助。我很可能误用了他的例子。在我看来,我的示例应该是JaxB中易于支持的—毕竟,java主要基于继承关系!

如果您能快速回复,我将不胜感激!

共有1个答案

相高谊
2023-03-14

您可以执行以下操作:

  • JAXB将引入超类,但不会引入子类。您可以在叶类上创建JAXBContext,也可以在父类上使用注释来引入子类
  • 您需要提供根元素信息。下面,我用JAXBElement完成了这项工作

演示

import javax.xml.bind.*;
import javax.xml.namespace.QName;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(B1.class, B2.class);

        B1 b1 = new B1();
        JAXBElement<A> jaxbElement = new JAXBElement<A>(new QName("root"), A.class, b1);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(jaxbElement, System.out);
    }

}

输出

下面是运行演示代码的输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b1"/>

您好,这可能是一个非常愚蠢的问题,但我只是想知道,如果我有一个C类,它包含一个对象(或子类)的ArrayList,我将如何调整这个问题?

C

下面是您在评论中描述的C类:

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class C {

    private List<A> as = new ArrayList<A>();

    @XmlElement(name="a")
    public List<A> getAs() {
        return as;
    }

}

A

下面是如何利用XMLSee注释引入子类的方法

@XmlSeeAlso({ B1.class, B2.class })
public class A {
    private String m_name;
}

下面是一些演示代码,以显示一切工作。请注意,现在我们使用的是JAXBContext,我们在引导时不需要包含子类。

演示

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(C.class);

        C root = new C();
        root.getAs().add(new B1());
        root.getAs().add(new B2());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

输出

下面是运行演示代码的输出。

<?xml version="1.0" encoding="UTF-8"?>
<c>
    <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b1"/>
    <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b2"/>
</c>
 类似资料:
  • FAQs in section [22]: [22.1] 将接口和实现分离的作用是什么? [22.2] 在C++中如何分离接口和实现(就象 Modula-2)? [22.3] 什么是 ABC? [22.4] 什么是“纯虚”成员函数? [22.5] 如何为包含指向(抽象)基类的指针的类定义拷贝构造函数或赋值操作符? 22.1 将接口和实现分离的作用是什么? 接口是公司最有价值的资源。设计接口比用一堆

  • 继承一个可以实现的普通超类有什么不同吗? atm我有一个名为的抽象类,我有/扩展这个。 abstractcar中的一个字段设置为"私有int容量" 但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问” 我想: > 子类继承超类的所有字段和方法? 我现在该怎么进行?

  • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

  • 问题是: 我有一个叫做Schema的基类,它是抽象的,它是一个未生成的类。我有两个从Schema继承生成的JAXB类:FixedWidthSchema和DelimitedSchema。 我使用外部绑定(xjb)文件来指定XSD和Java类之间的映射。 在基类模式中,我定义了几个方法: 公共架构静态创建(Model m),它从提供的模型创建架构。 公共抽象Writer marshal(),它将当前架

  • 我的代码: 问题:“

  • 问题内容: 我可以以某种方式在抽象类上对一组注释进行分组,并且扩展该类的每个类都已自动分配了这些注释? 至少以下情况不起作用: 问题答案: 答案是不 除非注释类型具有@Inherited元注释,否则不会继承Java注释:https : //docs.oracle.com/javase/7/docs/api/java/lang/annotation/Inherited.html。 Spring的注释