JAXB做错了; 尝试Xembly

JAXB是一项具有10年历史的Java技术,它使我们能够将Java对象转换为XML文档(编组)并返回(取消编组)。 我认为这项技术基于setter和getter,并且通过将对象转换为被动数据结构而违反了面向对象编程的关键原理。 我建议您改用Xembly将Java对象编组为XML文档。

这就是JAXB编组的工作方式。 假设您有一个Book类,需要将其编组为XML文档。 您必须创建吸气剂并对其进行注释:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Book {private final String isbn;private final String title;public Book(final String isbn, final String title) {this.isbn = isbn;this.title = title;}@XmlElementpublic String getIsbn() {return this.isbn;}@XmlElementpublic String getTitle() {return this.title;}
}

然后创建一个编组器,并要求它将Book类的实例转换为XML:

final Book book = new Book("0132350882", "Clean Code");
final JAXBContext context = JAXBContext.newInstance(Book.class);
final Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.marshal(book, System.out);

您应该在输出中期望这样的事情:

<?xml version="1.0"?>
<book><isbn>0132350882</isbn><title>Clean Code</title>
</book>

那怎么了 对象关系映射的错误几乎是同一回事,在ORM中解释了“进攻性反模式” 。 JAXB将对象视为数据包,提取数据并将其按照JAXB的要求将其转换为XML。 对象无法控制此过程。 因此,对象不再是对象 ,而是被动的数据包。

一种理想的方法是重新设计我们的班级Book this:

public class Book {private final String isbn;private final String title;public Book(final String isbn, final String title) {this.isbn = isbn;this.title = title;}public String toXML() {// create XML document and return}
}

但是,这种方法存在一些问题。 首先,存在大量的代码重复。 在Java中,构建XML文档是一个相当冗长的过程。 如果每个类都必须在其toXML()方法中重新实现它,那么重复代码将是一个大问题。

第二个问题是我们不确切知道应该以哪种类型包装XML文档。它可能是StringInputStreamorg.w3c.dom.Document的实例。 在每个对象中创建许多toXML()方法肯定是一场灾难。

Xembly提供了一种解决方案。 正如我前面提到的 ,它是XML结构和操作命令式语言。 这是我们如何在Xembly的帮助下实现Book对象的方法:

import org.xembly.Directive;
public class Book {private final String isbn;private final String title;public Book(final String isbn, final String title) {this.isbn = isbn;this.title = title;}public Iterable<Directive> toXembly() {return new Directives().add("book").add("isbn").set(this.isbn).up().add("title").set(this.title).up().up();}
}

现在,为了构建XML文档,我们应该在对象外部使用以下代码:

final Book book = new Book("0132350882", "Clean Code");
final String xml = new Xembler(book.toXembly()).xml();

Xembler类会将Xembly指令转换为XML文档。

此解决方案的优点在于,不通过getter公开对象的内部,并且该对象完全负责XML编组过程。 另外,这些指令的兼容性可能很高-远远高于JAXB的繁琐注释。

  • Xembly是一个开源项目,因此随时向Github提交您的问题或更正。

翻译自: https://www.javacodegeeks.com/2015/04/jaxb-is-doing-it-wrong-try-xembly.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rnn神经网络 层次_精讲深度学习RNN三大核心点,三分钟掌握循环神经网络

每天给小编五分钟&#xff0c;小编用自己的代码&#xff0c;让你轻松学习人工智能。本文将剖析循环神经网络(RNN)的工作原理&#xff0c;精讲循环神经网络的特点和实现方式。野蛮智能&#xff0c;小白也能看懂的人工智能。循环神经网络从何而来&#xff1f;我在我的这篇文章介绍…

我的偶像特质

1、泰国英拉&#xff1a;谦和品质&#xff0c;诚实&#xff0c;隐忍&#xff0c;有外交风范。 此前默默无闻的英拉依靠选举机器与个人魅力的完美协作&#xff0c;英拉完成了从女高管到女总理的身份飞越。 对手&#xff1a;“英拉从未利用媒体攻击商业对手&#xff0c;而是尽量避…

摆脱匿名类

我真的很喜欢编写和阅读lambda表达式-它们简洁&#xff0c;富于表现力和时尚&#xff08;来吧&#xff0c;这样就没关系了&#xff01;&#xff09;。 将此与匿名类进行比较。 这就是为什么我喜欢摆脱它们&#xff01; 在过去的几个月中&#xff0c;这种认识慢慢地实现了&…

惠普自动化测试软件官网,惠普最新测试管理工具 HP ALM 11.0 详细介绍

惠普应用生命周期管理(HPalm/" target"_blank" >ALM11)是业界首款集成的、跨技术和流程、可拓展的平台&#xff0c;使IT能够管理应用生命周期&#xff0c;并且从项目建议到运营全过程中贯穿应用交付。在拓展惠普软件应用组合(HPSoftwareApplicationsportfoli…

poj 题目分类(3)

OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj329…

ARM学习(24)Can的高阶认识和错误处理

笔者来聊一下CAN协议帧的认识和错误处理。 1、CAN协议帧认识 CAN 差分信号&#xff0c;是经过CAN收发器转成差分信号的&#xff0c;CAN RX和TX是逻辑电平。CAN的基础知识&#xff0c;可参考笔者这边文章&#xff1a;ARM学习&#xff08;21&#xff09;STM32 外设Can的认识与驱…

云桌面 瘦终端_小米盒子连接Citrix云桌面

先前看到很多公司使用Wyse、Hp等瘦终端设备登陆Citrix云桌面&#xff0c;便想购得一台瘦终端设备&#xff0c;想来只是为了测试&#xff0c;况且瘦终端价格不低&#xff0c;便一直未买。后使用自己的平板连接Citrix XenDesktop创建的Win7桌面&#xff0c;感觉效果很好&#xff…

Apache Mesos + Marathon和Java EE

Apache Mesos是一个开放源代码群集管理器&#xff0c;可在分布式应用程序或框架之间提供有效的资源隔离和共享。 Apache Mesos从计算机&#xff08;物理或虚拟&#xff09;上提取CPU&#xff0c;内存&#xff0c;存储和其他计算资源&#xff0c;从而使容错和弹性的分布式系统易…

计算机指令中数据寻址的方式,1.变址寻址需要在指令中提供一个寄存器编号和一个数值。 2.计算机的指令越多,功能越强越好。 3.程序计数...

满意答案happysk72推荐于 2017.12.16采纳率&#xff1a;57% 等级&#xff1a;12已帮助&#xff1a;21199人1.对变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加&#xff0c;从而得到一个操作数的有效地址。变址寻址方式常用于访问某基…

tab切换-自动、点击、内容变换

<div class"tab"> <ul class"pics"> <li><a href""><img src"images/pic2.jpg" width"448" height"315" alt"宝业大和工业化住宅制造…

在JAX-RS中使用@Context [第1部分]

JAX-RS提供Context批注&#xff0c;以在RESTful服务中注入各种资源。 一些最常用的注入组件是HTTP标头&#xff0c;HTTP URI相关信息。 这是完整列表&#xff08;无特定顺序&#xff09; HTTP标头 HTTP URI详细信息 安全上下文 资源上下文 请求 组态 应用 提供者 让我…

babel原理_带你了解 snowpack 原理,你还学得动么(下)

作者&#xff1a;AlienZHOU转发链接&#xff1a;https://zhuanlan.zhihu.com/p/149351900目录带你了解 snowpack 原理&#xff0c;你还学得动么(上)带你了解 snowpack 原理&#xff0c;你还学得动么(下)本篇小编建议小伙们从第一篇开始&#xff0c;按照顺序来看&#xff0c;更清…

测试社交软件有哪些,性格测试:测你适合哪个社交平台

你喜欢通过什么方式和人交流&#xff1f;随着网络世界越来越发达&#xff0c;人们越来越倾向于使用社交工具来维系与家人、朋友、同事之间的关系。不但在现实生活中不好直接表达出来的话通过网上交流的方式可以顺畅地表达出来&#xff0c;而且也节约了时间上的成本&#xff0c;…

VS2012无法安装cocos2d-x-2.1.4 解决方法及VS2012新建coco2d-x项目(一)

转自&#xff1a;http://www.cnblogs.com/wangpei/admin/EditPosts.aspx?opt1 &#xff08;注&#xff1a;此方法是可行&#xff0c;仅供参考&#xff0c;建议大家直接看我的 一见命令解决vs安装并创建cocos2d-x&#xff0c;如果你习惯了和以前一样在vs点击创建就用这个方法&a…

JMS 2.0中JMSContext的类型

如果您遵循Java EE&#xff0c;您将不会知道JMS 2.0&#xff08;Java EE 7&#xff09;中的简化API组件。 构成简化API一部分的重要接口之一是javax.jms.JMSContext接口。 根据实例的获取和管理方式&#xff08;生命周期&#xff09;&#xff0c;JMSContext可以分为两种类型&a…

excelexportentity中设置null不显示的方法_一般人不知道的线程间数据交换Exchanger

线程间的数据共享除了定义一个共享数据然后各个线程去访问这种方式外&#xff0c;还可以使用Exchanger交换数据。简单案例首先看看Exchanger的运用&#xff0c;Exchanger最简单的测试代码&#xff0c;如下图&#xff1a;对应打印的结果如下&#xff1a;线程2创建对象java.lang.…

画毛毛虫代码计算机图形学,考试计算机图形学考试计算机图形学.docx

考试计算机图形学考试计算机图形学计算机图形学大题第四章1个。第六章2个第七章1个第一章4、比较个人计算机与工作站的图形功能个人计算机仅限于符合二维&#xff0c;又是单任务操作方式工作站可处理二、三维&#xff0c;多任务操作方式区别个人计算机工作站显示分别率640 X 48…

网卡驱动程序之编写虚拟网卡(二)

一、virt_net.c /** 参考 drivers\net\cs89x0.c*/#include <linux/module.h> #include <linux/errno.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/kernel.h> #include <linux/types.h> #include <…

冷热rx-java可观察

我自己对“热的和冷的可观察的”的理解是不稳定的&#xff0c;但这是我到目前为止所了解的&#xff01; 冷观测 考虑一个返回rx-java Observable的API&#xff1a; import obs.Util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import rx.Observable; import…

布尔表达式的语法及语义分析程序_XSS语义分析的阶段性总结(一)

作者&#xff1a;Kale 合天智汇前言由于X3Scan的研发已经有些进展了&#xff0c;所以对这一阶段的工作做一下总结&#xff01;对于X3Scan的定位&#xff0c;我更加倾向于主动被动的结合。主动的方面主要体现在可以主动抓取页面链接并发起请求&#xff0c;并且后期可能参考XSStr…