JAXB 继承,解组到编组类的子类

2024-01-27

我正在使用 JAXB 来读取和写入 XML。我想要的是使用基本 JAXB 类进行编组,并使用继承的 JAXB 类进行解组。这是为了允许发送方 Java 应用程序将 XML 发送到另一个接收方 Java 应用程序。发送者和接收者将共享一个公共的 JAXB 库。我希望接收方将 XML 解组到接收方特定的 JAXB 类中,该类扩展了通用 JAXB 类。

Example:

这是发送者使用的公共 JAXB 类。

@XmlRootElement(name="person")
public class Person {
    public String name;
    public int age;
}

这是解组 XML 时使用的接收器特定的 JAXB 类。接收器类具有特定于接收器应用程序的逻辑。

@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
    public doReceiverSpecificStuff() ...
}

编组按预期工作。问题出在解组上,它仍然解组到Person尽管 JAXBContext 使用子类的包名称ReceiverPerson.

JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);

我想要的是解组到ReceiverPerson。我能够做到这一点的唯一方法是删除@XmlRootElement from Person。不幸的是这样做可以防止Person免遭编组。就好像 JAXB 从基类开始并向下工作,直到找到第一个@XmlRootElement具有适当的名称。我试过添加一个createPerson()返回的方法ReceiverPerson to ObjectFactory但这没有帮助。


以下代码片段是 Junit 4 测试的方法并获得批准:

@Test
public void testUnmarshallFromParentToChild() throws JAXBException {
  Person person = new Person();
  int age = 30;
  String name = "Foo";
  person.name = name;
  person.age= age;

  // Marshalling
  JAXBContext context = JAXBContext.newInstance(person.getClass());
  Marshaller marshaller = context.createMarshaller();

  StringWriter writer = new StringWriter();
  marshaller.marshal(person, writer);

  String outString = writer.toString();

  assertTrue(outString.contains("</person"));

  // Unmarshalling
  context = JAXBContext.newInstance(Person.class, RecieverPerson.class);
  Unmarshaller unmarshaller = context.createUnmarshaller();
  StringReader reader = new StringReader(outString);
  RecieverPerson reciever = (RecieverPerson)unmarshaller.unmarshal(reader);

  assertEquals(name, reciever.name);
  assertEquals(age, reciever.age);
}

重要的部分是使用JAXBContext.newInstance(Class... classesToBeBound)解组上下文的方法:

 context = JAXBContext.newInstance(Person.class, RecieverPerson.class);

通过此调用,JAXB 将计算指定类的引用闭包并识别RecieverPerson。测试通过。如果你改变参数顺序,你会得到一个java.lang.ClassCastException(所以他们must按此顺序通过)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAXB 继承,解组到编组类的子类 的相关文章

随机推荐

  • document.ready() 内部函数和 标签中的函数之间的区别

    这两个函数有什么区别 1 document ready function myfunc function dosomething do something 2 The document ready 函数在 DOM 加载完成时执行 看http
  • mvc3 - 如何从源代码禁用符号的 htmlencode

    我需要从数据库表中取出页面文本 表字段 文本 包含带有 html 格式标记的文本 例如 p br 等等 在表中它没有编码 当我尝试使用 Model Text 输出时 我看到编码的 html 标签 例如 lt p gt 我怎样才能禁用这个 h
  • 如何发现正在使用的 Linux 发行版

    有时我需要访问一些运行Linux 或者可能是另一个类Unix SO 的服务器 但我不知道如何验证哪些服务器分配 http en wikipedia org wiki Linux distribution正在服务器上使用 有时甚至服务器的 负
  • 当我尝试在 Xcode 中重构时,出现一条警告,要求将文件添加到此工作区中目标的构建阶段

    当我尝试通过重命名来重构代码时 我经常看到此消息 h is not part of the build phase of any targets in this workspace and so can t be refactored Ad
  • 创建没有数组的刽子手游戏[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这就是输出的样子 我需要在原始字符串中找到猜测的索引 如果这是真的 那么应该用读入的字符替换索引处的问号 字符串猜测 之后 它应该从字符串
  • 表达式求值的顺序

    我很好奇一些不同类型的表达式的顺序 所以我在顶部声明级别尝试了这段代码 认为它会失败 但发现它有效 http play golang org p CfP3DEC5LP http play golang org p CfP3DEC5LP va
  • 在新的 CardView 中对齐多个 TextView

    我正在尝试创建一个 CardView 它将显示作者的引用 包括作者姓名 引用以及其下面的引用 我想我已经掌握了大部分内容 但似乎对齐 TextView 的一般规则似乎不适用于 CardView 我在这里研究发现你应该添加android la
  • ANT - 无法加载依赖类 com/jcraft/jsch/Logger

    我的 Ant 脚本有问题 我需要将文件复制到 Linux 服务器
  • go 中 ioutil.ReadAll 的替代方案?

    对于我正在制作的程序 此函数作为 for 循环中的 goroutine 运行 具体取决于传入的 url 数量 没有设定数量 func makeRequest url string ch chan lt string errors map s
  • 当两个超类具有同名但签名不同的成员函数时,存在歧义

    struct A void f int x struct B template
  • 安装了Visual Studio 2010 SP1,仍然不支持CSS3和HTML5

    我已从以下位置下载了最新版本的 Visual Studio 2010 Service Pack 1 here http www microsoft com download en details aspx id 23691 然而 在我提取文
  • 如何在分解时间序列图中自定义标题、轴标签等

    我相当熟悉通过编写自己的 x 轴标签或主标题来修改绘图的常用方法 但在绘制时间序列分解的结果时 我无法自定义输出 例如 library TTR t lt ts co2 frequency 12 start 1 deltat 1 12 td
  • 测试小程序的最佳机制是什么?

    我正在尝试有效地为小程序构建一个功能测试套件 并且我正在尝试为其找到一个好的框架 过去 当我想设计一个测试套件来对应用程序进行功能测试和负载测试时 它始终是基于 Web 的应用程序 或者至少是某种基于服务的应用程序 并且我已经使用grind
  • 如何在http get请求中设置标头?

    我正在 Go 中执行一个简单的 http GET client http Client req http NewRequest GET url nil res client Do req 但我找不到自定义请求标头的方法doc http go
  • 如何获取维基数据上所有电影的列表?

    我正在使用 Freebase 为我的网站获取所有电影 但它很快就会被关闭 所以我在寻找另一个免费的电影数据库并发现了维基数据 说实话 如何查询所有电影太复杂了 所以我想你们可以帮助我获取维基数据中的所有电影 将来我还想加入电视节目和连续剧
  • jQuery - 对数组进行排序?

    我使用 Ajax 获取一些 XML 然后用结果填充表单上的一些字段 表单上有一个数字字段 我想按该数字对结果进行排序 从高到低的在前 我将如何在 jQuery 中做到这一点 我的js函数代码目前是 function linkCounts w
  • 运行时动态绑定和类继承之间的区别

    我试图澄清动态语言 Python Ruby 和静态类型语言 java C 中运行时动态绑定和类继承的概念 我不确定我是对还是错 在 Python 和 Ruby 等动态语言中 运行时动态绑定是作为鸭子类型实现的 当解释器检查对象的类型时 它检
  • 新 Chrome 打包应用程序的最小/最大按钮在哪里?

    我正在使用 Chrome 的开发通道 v23 并且正在使用新的Chrome 打包应用程序 http developer chrome com dev apps about apps html平台 新平台的目的之一是将打包应用程序 从浏览器中
  • 卷积神经网络如何处理通道

    我已经浏览了很多关于 CNN 通常处理多个通道 例如 RGB 图像中的 3 个 的方式的解释 但我仍然不知所措 当将 5x5x3 滤镜 例如 应用于 RGB 图像的补丁时会发生什么exactly发生 实际上是每个通道分别发生 3 个不同的
  • JAXB 继承,解组到编组类的子类

    我正在使用 JAXB 来读取和写入 XML 我想要的是使用基本 JAXB 类进行编组 并使用继承的 JAXB 类进行解组 这是为了允许发送方 Java 应用程序将 XML 发送到另一个接收方 Java 应用程序 发送者和接收者将共享一个公共