JAXB 和抽象类

2023-11-22

我尝试使用 JAXB 来解组一些 XML,但出现“无法创建...的实例”异常。我明白为什么——它试图创建一个抽象类的实例。我想要的是让它创建一个特定实现类的实例。我的目标是对 setter 方法进行特定于类的检查。也许“qux”是 BarImpl 的有效 baz 值,但 BarImpl2 想要做其他事情。

我通过不注释 Foo 达到了部分目的,但如果我取消注释 bar,事情就会变得很难看。

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.junit.Test;


public class JAXBTest {

    @Test
    public void test() throws javax.xml.bind.JAXBException {
        String xml = 
            "<foo>" +
            "  <bar>" +
            "    <baz>qux</baz>" +
            "  </bar>" +
            "</foo>";

        javax.xml.bind.JAXBContext context = javax.xml.bind.JAXBContext.newInstance(
                FooImpl.class,
                BarImpl.class
        );

        javax.xml.bind.Unmarshaller unmarshaller = context.createUnmarshaller();

        unmarshaller.unmarshal(new java.io.StringReader(xml));
    }

    @XmlRootElement(name="foo")
    public static abstract class Foo {
        @XmlElement(name="bar")
        Bar bar;
    }

    @XmlRootElement(name="bar")
    public static abstract class Bar {
        @XmlElement(name="baz")
        String baz;
    }

    public static class FooImpl extends Foo { }
    public static class BarImpl extends Bar { }
}

您可以执行以下操作:

  • 用注释 impl 类@XmlRootElement而不是抽象类。
  • 标记抽象类@XmlTransient (see http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)
  • Use @XmlElement(type=BarImpl.class) on the bar属性来指定具体类型(参见http://blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html).

JAXBTest

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.junit.Test;


public class JAXBTest {

    @Test
    public void test() throws javax.xml.bind.JAXBException {
        String xml = 
            "<foo>" +
            "  <bar>" +
            "    <baz>qux</baz>" +
            "  </bar>" +
            "</foo>";

        javax.xml.bind.JAXBContext context = javax.xml.bind.JAXBContext.newInstance(
                FooImpl.class,
                BarImpl.class
        );

        javax.xml.bind.Unmarshaller unmarshaller = context.createUnmarshaller();

        unmarshaller.unmarshal(new java.io.StringReader(xml));
    }

    @XmlTransient
    public static abstract class Foo {
        @XmlElements({
            @XmlElement(name="bar",type=BarImpl.class),
            @XmlElement(name="bar",type=BarImpl2.class),
        })
        Bar bar;
    }

    @XmlTransient
    public static abstract class Bar {
        @XmlElement(name="baz")
        String baz;
    }

    @XmlRootElement(name="foo")
    public static class FooImpl extends Foo { }

    @XmlRootElement(name="bar")
    public static class BarImpl extends Bar { }

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

JAXB 和抽象类 的相关文章

  • 使用 Checkstyle Plugin 时从插件调用代码时出现问题:“org.eclipse.jface”

    我正在尝试在 Rational Software Architect 7 0 0 4 上使用 eclipse cs 插件 我最近卸载了旧的 beta2 版本并安装了 beta3 插件本身按照之前的配置工作 但是每当我尝试通过 Windows
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 具有多种值类型的 Java 枚举

    基本上我所做的是为国家编写一个枚举 我希望不仅能够像国家一样访问它们 而且还能够访问它们的缩写以及它们是否是原始殖民地 public enum States MASSACHUSETTS Massachusetts MA true MICHI
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮

随机推荐

  • 版本冲突更新到8.4.0

    Error 任务 app processDebugGoogleServices 执行失败 请 通过更新版本来解决版本冲突 google services 插件 最新版本信息为可以在这里找到 或将 com google android gms
  • Python 输入永远不等于整数[重复]

    这个问题在这里已经有答案了 我想插入一个数字 如果我输入 4 以外的任何数字 它会告诉我这是错误的 但如果它是假的 它会告诉我 gg 你赢了 菜鸟 但是当我插入 4 时 它告诉我这是不正确的 x input Insert a numer w
  • C# 中对 GRPC 的 TLS 支持

    我对 C 相当陌生 我需要使用基于 TLS 的 GRPC 作为一次演练 我正在修改中提供的示例主要 grpc 仓库使用 TLS 为此 我发现了另一个问题 似乎是一个很好的答案 如何为 gRPC 启用服务器端 SSL 但是 我收到错误Unha
  • 如何在现有的 momentjs 对象中获取没有时间的日期?

    假设我有如下的 momentjs 对象 var date moment new Date 2014 2 17 9 60 我怎样才能在没有时间的情况下克隆并获取新的 momentjs 对象 对于 moment 1 7 及以上版本 只需使用 s
  • MySql 一般错误:2053

    我收到错误 错误 SQLSTATE HY000 一般错误 2053 我不知道为什么会发生这种情况 因为代码工作正常并且数据库已更新 但它仍然返回此错误 这是我的代码
  • Angular Material - mat-table 不渲染来自rest api 的数据

    我一直在努力实施this来自 Angular Material 的表格示例 没有运气 我不明白我做错了什么 我的 REST 端点提供的数据在控制台输出上清晰可见 我的怀疑是 当呈现表格时 数据可能还没有完全加载 任何帮助表示赞赏 谢谢 la
  • Rails ActiveRecord 按日期查找/搜索

    我试图按 created at 日期查找记录 数据库列类型为 datetime 并且 我正在使用 jQuery 的 UI DatePicker 我的网址如下所示 localhost 3000 users supported selected
  • 当前上下文中不存在 Server.MapPath

    我有一个 C 模型类 我正在尝试访问 cshtml页面应该是电子邮件格式模板 我正在使用以下代码 string body string Empty using StreamReader reader new StreamReader Ser
  • 为什么 Web 服务返回数据为 msg.d

    我发现我的网络方法返回的数据为 d id 1 itemtxt Masters id 2 itemtxt Transactions id 3 itemtxt Misch Reports 如果您注意到 该数组被命名为 d 这是为什么 有什么规定
  • pyenv:构建失败(Fedora 34 使用 python-build 20180424)

    我需要帮助通过 pyenv 安装 python pyenv v pyenv 1 2 27 我尝试安装3 6 8版本 pyenv install 3 6 8 我收到错误 正在下载 Python 3 6 8 tar xz gt https ww
  • 在匿名函数中测试 JavaScript 函数

    是否可以测试myInnerFunction below var val function var myInnerfunction function input return input I ADDED THIS return myInner
  • PHP:7 PDO fetch(All) 尝试将类型转换为关联类型

    今天我发现我们的代码似乎与 PDO 的更改向后不兼容 在 PHP PDOStatement通过其职能fetch and fetchAll返回其值为字符串或 null 的行 我们的代码依赖于这个属性 不久前我们更新到了 PHP 7 事实证明
  • 从 C# 中的行中提取 GUID

    我尝试使用 IndexOf 来简化一些遗留代码 以从行中检索 GUID 我可以进一步简化下面的代码以摆脱使用 guids Any 和 guids First 吗 Code using regular expression private s
  • 使用 + 和 - 符号格式化数字

    我在堆栈面板中有一些 WPF 文本块 我想要对其进行数据绑定和格式化 例如 以下格式为不带秒部分的日期 24 小时格式
  • 是否有任何指定数字功能的特征?

    我想使用一个特征来绑定一个通用类型 就像这个假设的HasSQRT fn some generic function
  • 我应该对 POST 数据进行 URL 编码吗?

    我正在将数据发布到外部 API 使用 PHP 如果相关的话 我应该对传递的 POST 变量进行 URL 编码吗 或者我只需要对 GET 数据进行 URL 编码 更新 这是我的 PHP 以防相关 fields array mediauploa
  • 与 Typescript Readonly 类型不一致

    我遇到了与 Typescript 不一致的问题Readonly我不明白 Typescript v3 9 2 playground here interface Thing name string interface Obj arr Thin
  • MySQL 全文搜索和 SOUNDEX

    我正在尝试使用全文搜索和 SOUNDEX 来实现名字和姓氏搜索 以防名字拼写错误 我试图做类似的事情 SELECT FROM employees WHERE MATCH SOUNDEX first name last name AGAINS
  • SwiftUI 和 UICloudSharingController 互相讨厌

    我有一个使用 SwiftUI 的项目 需要 CloudKit 共享 但我无法获取UICloudSharingController在 SwiftUI 环境中发挥出色 第一个问题 一个简单的包装UICloudSharingController
  • JAXB 和抽象类

    我尝试使用 JAXB 来解组一些 XML 但出现 无法创建 的实例 异常 我明白为什么 它试图创建一个抽象类的实例 我想要的是让它创建一个特定实现类的实例 我的目标是对 setter 方法进行特定于类的检查 也许 qux 是 BarImpl