JAXB - 具有多个名称和类型的 XmlElement

2024-03-05

我有以下类层次结构:

@XmlRootElement
public abstract class Animal{}

@XmlRootElement
public class Dog extends Animal{}

@XmlRootElement
public class Cat extends Animal{}

@XmlRootElement
public class Lion extends Animal{}

和一个具有名为 Animal 的属性的类:

@XmlRootElement
public class Owner{
  private Animal animal;
}

我想允许不同的 XML 模式,如下所示,并将模式中的动物类型绑定到animal object in Owner class

<Owner>
 <Dog></Dog>
</Owner>

<Owner>
 <Cat></Cat>
</Owner>

<Owner>
 <Lion></Lion>
</Owner>

我发现有用的解决方案XmlElements这可能需要多个XmlElement字段并创建一个集合。但是,就我而言,我不需要集合,而是单个属性。

JAXB 是否允许任何 XmlElement 多重命名约定来解决此问题? 有没有其他注释可以解决这个问题?

注意:我在 stackoverflow 和周围查看了类似问题的多个答案,但几乎所有答案都创建了一个集合而不是单个对象。我找到的最接近的答案是:@XmlElement 具有多个名称 https://stackoverflow.com/questions/24554789/xmlelement-with-multiple-names

编辑:我认为this http://blog.bdoughan.com/2010/10/jaxb-and-xsd-choice-xmlelements.html解决方案可能有效。必须测试一下


我让它工作使用@XmlElements http://docs.oracle.com/javaee/7/api/javax/xml/bind/annotation/XmlElements.html注释,如下:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) throws JAXBException {
        String xml = "<owner><dog></dog></owner>";
        JAXBContext jaxbContext = JAXBContext.newInstance(Owner.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Owner owner = (Owner) jaxbUnmarshaller.unmarshal(
                new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));

        System.out.println(owner.getAnimal().getClass());
    }
}

abstract class Animal {}

class Dog extends Animal {}

class Cat extends Animal {}

class Lion extends Animal {}

@XmlRootElement
class Owner {
    @XmlElements({
            @XmlElement(name = "dog", type = Dog.class),
            @XmlElement(name = "cat", type = Cat.class),
            @XmlElement(name = "lion", type = Lion.class)
    })
    private Animal animal;

    public Animal getAnimal() {
        return animal;
    }
}

使用 Oracle Java 8 SDK 附带的默认 JAXB 实现,将打印出:

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

JAXB - 具有多个名称和类型的 XmlElement 的相关文章

  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 为什么在将 String 与 null 进行比较时会出现 NullPointerException?

    我的代码在以下行中出现空指针异常 if stringVariable equals null 在此语句之前 我声明了 stringVariable 并将其设置为数据库字段 在这个声明中 我试图检测该字段是否有null值 但不幸的是它坏了 有
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐

  • 如何在libavcodec中设置解码像素格式?

    我使用以下代码通过 libavcodec 解码视频 Open input file if avformat open input ctx filename NULL NULL 0 return FALSE Couldn t open fil
  • Angular 2 - 如何嵌入 youtube 视频

    我得到了这个代码 div div class video container div div 问题 角度将输出src localhost 8001 代替src https www youtube com embed hr4BbdUiTUM
  • 如何在 PHP 中使用 Postgresql 白名单和准备语句?

    我知道我需要在我的 php 代码中实现白名单和准备好的语句 但我不确定如何使用 Postgresql 执行此操作 这对我的代码来说真的有必要吗 我使用选择列表将用户选择的值传递给查询
  • UTF-8 和 ISO 8859-9

    在过去的几天里 我一直在阅读有关 UTF 8 和 unicode 的内容 当我以为我已经了解了这一切时 当我读到 UTF 8 和 ISO 8859 9 不兼容时 我感到很困惑 我有一个以 UTF 8 格式存储数据的数据库 客户要求我支持各种
  • C/C++ 中的梅尔频率倒谱系数 (MFCC)

    C C 中是否有 MFCC 的实现 有源代码或库吗 我已经找到了http code google com p libmfcc http code google com p libmfcc 这看起来不错 2016年回顾 libmfcc很简单
  • 从 Apache Spark 分段上传到 Amazon S3

    将数据保存到 Amazon S3 时 如何使 Apache Spark 使用分段上传 Spark使用以下方式写入数据RDD saveAs File方法 当目的地开始时s3n Spark 自动使用 JetS3Tt 进行上传 但对于大于 5G
  • 构建 OpenSSL x64 静态库时出现错误“错误 A2009:表达式中的语法错误”

    我需要 Openssl 的静态库 我按照以下指示进行操作here https stackoverflow com questions 158232 how do you compile openssl for x64 我所做的步骤如下 运行
  • 在 C# 中杀死除我的程序之外的所有进程

    不 这不是恶意软件 我正在尝试制作一个 PC 辅助工具来杀死所有非 Windows 进程的任务 但在此过程中 它会杀死自己 这是一个控制台应用程序 所以我尝试删除 cmd exe 来终止 但它仍然终止了我的程序 有类似这样的方法吗 if p
  • Scrapy 在爬行几页后停止爬行

    我刚刚学习了 Scrapy 和网站爬虫的基础知识 所以我非常感谢您的意见 我在教程的指导下 从 Scrapy 构建了一个简单明了的爬虫 它工作正常 但不会按应有的方式抓取所有页面 我的蜘蛛代码是 from scrapy spider imp
  • 在 C# 中声明固定大小数组的列表

    我有一个对像素进行操作的函数 我想创建一个包含 RGB 值的列表 但是当我这样声明时 List
  • 可靠地将包含 PHP 数组信息的字符串转换为数组 [重复]

    这个问题在这里已经有答案了 可能的重复 模拟 php 数组语言构造或使用正则表达式解析 https stackoverflow com questions 3267951 simulate php array language constr
  • BDE dbidorestruct 返回空表

    在我的 Delphi Sydney Win 10 应用程序中 我使用 BDE 即使在今天也是如此 当我更改 更改 删除字段时 我想修改其现有的 悖论 表 我发现了一个免费软件组件 TFieldUpdate v1 1 由 Nathanial
  • 你会推动每一个提交吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我希望有人能给我更多有关使用 git 和远程存储库的详细信息 我还没有使用过远程存储库 您向本地存储库提交较小的更改 这些更改可能不会太令人震惊
  • CMD 行判断文件/路径是本地还是远程?

    从 NT shell 脚本中 我需要能够判断目标路径是否位于本地驱动器上 例如C or D 或在远程 映射驱动器上 或者 UNC path或映射的驱动器盘符 例如Z 有什么建议么 echo off goto main isremote se
  • 如何更改 Android 的日期选择器样式

    我目前正在制作一份注册表 其中一个字段是用户的出生日期 我想使用日期选择器 但我不想要如下所示的日历布局 我希望布局看起来像这样 这样就可以更轻松地选择年份和月份 而无需滚动浏览所有内容 但是我不知道如何解决这个问题 也不知道在 style
  • 哪个是保持逻辑角度的最佳位置?

    我正在开发一个角度应用程序 假设当我们实现某个按钮的 onclick 等功能时 调用 api 处理数据 在表中显示结果 表数据应该跨页面保留 因此我们需要保持变量处于服务状态 为了实现 首先我们可以开始从模板调用函数 然后在组件中我们可以做
  • 在 WPF 中不断绘制大量位图的最佳方法?

    我被这个非常简单的问题难住了 我正在制作一个基于图块的游戏引擎 需要能够允许用户使用 WPF 用户界面编辑地图 天真地 我以为我可以简单地使用 Graphics FromImage 不断更新一个好的老式 缓冲 System Drawing
  • 如何在 pypi 上为新项目创建 API 令牌?

    我正在尝试使用 API 令牌将包上传到 PyPI 我想使用项目特定的 API 令牌而不是帐户特定的令牌 因为这看起来更安全 但是 由于尚未在 PyPI 上创建该项目 因此当我尝试在 PyPI 网站上创建新的 API 令牌时 没有可供选择的项
  • 如何使用 KeyEvent 定位正在运行的应用程序?

    我的目标是通过键事件来定位在后台服务的前台或后台运行的特定应用程序 我尝试了很多解决方案 但还没有成功 尝试的几个解决方案 全部来自后台运行的服务 通过广播 我尝试定位第一个管理关键事件的应用程序 例如电话应用程序 KeyEvent lKe
  • JAXB - 具有多个名称和类型的 XmlElement

    我有以下类层次结构 XmlRootElement public abstract class Animal XmlRootElement public class Dog extends Animal XmlRootElement publ