moxy json介绍_通过MOXy实现使您的JAXB更清洁

moxy json介绍

编组和解组XML时使用JAXB的主要优点是编程模型。 只需注释几个POJO并使用JAXB API,您就可以很容易地序列化为XML和从XML反序列化。 您无需担心有关XML如何编组/解组的细节。 一切都比DOM和SAX等替代方案简单得多。

现在,XML文件中的数据本质上趋于分层。 例如,考虑以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<person><firstname>Barok</firstname><lastname>Obama</lastname><age>52</age><car><model>Green Ford Focus 1.4L</model></car>
</person>

在这种情况下,Barok Obama人拥有的汽车是Green Ford Focus。 在这里,我们看到了XML的层次结构特征。 车在人下。 在一个更复杂的示例中,一个人可以拥有一个汽车,该汽车具有一个汽车收音机,该汽车具有一个放大器,该汽车具有晶体管等。但是,让我们暂时坚持我们的简单情况。 假设我们要使用JAXB解组该XML文件。 我们需要所有人的详细信息(名字,姓氏等)以及属于该人的汽车的型号。 我们创建一个Person POJO和Car POJO并进行适当的注释。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"name", "firstname", "lastname"})
public class Person {private String firstname;private String lastname;private int age;private Car car;public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getFirstname() {return firstname;}public void setFirstname(String name) {this.firstname = name;}public Car getCar() {return car;}public void setCar(Car car){this.car= car;}
}
public class Car {private String model;public String getModel() {return model;}public void setModel(String model){this.model = model;}
}

要解组,我们只需做

public static void unmarshall() throws Exception {JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();Person person = (Person)unmarshaller.unmarshal(new File("Person.xml"));System.out.println("Perosn is=" +person.toString());
}

这一切看起来非常简单-特别是当您考虑到Car实体甚至不需要任何注释时! 但是,Car仅具有一个属性,为我们只希望从中获得一个属性的东西而拥有POJO类似乎有点过头了! 记住,这是一个简单的示例,想象一下层次结构是否更深。 类似于包含实体的外部实体,其中包含另一个实体,该实体甚至包含另一个实体,而我们所需的只是外部实体和来自最深层嵌套实体的一个属性。 本质上是相同的问题,但更多的是矫kill过正。 我们必须确保在层次结构中的所有内容上都有POJO类,甚至对于我们不需要的实体也是如此。 没有人喜欢代码膨胀。 所以,我们能做些什么?

好吧,我们要记住的第一件事是,JAXB是一个规范,该规范有许多实现(例如JaxMeAPI,MOXy,Metro)。 如果我们要使用JAXB参考实现(随JDK一起提供,则无能为力)。 我们必须有一个汽车和人POJO。 但是,如果我们使用EclipseLink的MOXy实现,则可以使用其一些扩展来帮助我们。 更具体地说,我们可以使用受XPath启发的MOXy @XmlPath扩展。

让我们来看看它的作用。 这是更新的Person POJO。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"name", "firstname", "lastname"})
public class Person {private String firstname;private String lastname;private int age;public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getFirstname() {return firstname;}public void setFirstname(String name) {this.firstname = name;}@XmlPath("car/model/text()")private String model;public String getModel() {return model;}
}

那么,汽车POJO哪里去了? 好吧,它被删除了。 我们不再需要它了。 再见。
使用MOXy @XmlPath批注,我们不需要Car POJO。 该批注驻留在org.eclipse.persistence.oxm.annotations包中,将其放在类路径中确实很简单。 如果您是maven用户,只需添加:

<dependency><groupid>org.eclipse.persistence</groupId><artifactid>eclipselink</artifactId><version>2.3.2</version>
</dependency>

为了告诉您的JDK在运行时将MOXy用于JAXB实现,您放置了一个名为
jaxb.properties与您的JAXB POJO位于同一目录中。 它包含一行:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

为了确保您正在使用MOXy实现,只需检查JAXB上下文:

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
System.out.println("jaxbContext is=" +jaxbContext.toString());

您应该看到类似以下内容:

jaxbContext is=org.eclipse.persistence.jaxb.JAXBContext@5e3974

之后,没有任何变化。 完全相同的数据编码都可以使用。
我之所以喜欢此扩展的原因之一是因为它意味着更少的代码。 这通常意味着更简洁的代码和更多可维护的代码。 这在更复杂的情况下变得更加明显,在这种情况下,实体的层次结构比该简单示例要深得多。 如果使用诸如XJC之类的东西来生成POJO没关系,您仍然会感到代码膨胀。

请记住,JAXB被设置为比JAX替代品(例如SAX和DOM)更简洁的编程模型,但是在具有深层次结构的场景中,使用JAXB对类进行概要分析并不能使它令人信服地更加简洁。 请记住,使用DOM和XPath甚至仅使用SAX来忽略不需要的类将非常容易。

MOXy通过提供对XML文件中的任何内容使用XPath表达式的能力,将清洁的战斗带回到了JAXB。

注意:MOXy刚刚作为WebLogic 12c的JAXB实现包含在内。

参考文献:

  1. MOXy项目页面
  2. Blaise Doughan的博客
  3. 来自都柏林技术博客的 JCG合作伙伴 Alex Staveley 的MOXy实现使您的JAXB清洁器

相关文章 :

  • 使用JAXB从XSD生成XML
  • 重用生成的JAXB类
  • 将对象映射到多个XML模式–天气示例
  • JAXB,SAX,DOM性能
  • 带有简单框架教程的Android XML绑定

翻译自: https://www.javacodegeeks.com/2012/01/make-your-jaxb-cleaner-with-moxy.html

moxy json介绍

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

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

相关文章

Tomcat样列目录session 操控漏洞

一、基本情况 漏洞级别&#xff1a;中危 漏洞类别&#xff1a;session操纵漏洞 二、问题描述 ApacheTomcat默认安装页面中存在examples样例目录。里面存放着Servlets、JSP、WebSocket的一些服务脚本和接口等样例。Servletsexamples服务样例下存在一个session的样例。该样例可…

Failed to compile. ./src/utils/request.js Module not found: Error: Can‘t resolve ‘util-merge‘ in ‘C

在webstorm运行vue的一个项目&#xff0c;访问主页报错&#xff1a; Failed to compile. ./src/utils/request.js Module not found: Error: Cant resolve util-merge in C:\Users\Pactera\Desktop\rtt_web\src\utils 检查了一下代码是缺少util-merge插件。可以在编译器上进…

发布:NetBeans IDE 8.1 Beta

NetBeans IDE 8.1 Beta已发布。 NetBeans IDE在为Java开发人员提供完整而全面的工具方面拥有超过15年的丰富经验。 在过去的几年中&#xff0c;NetBeans IDE已为JavaScript开发人员实现了同样的目标。 特别是&#xff0c;NetBeans IDE 8.1引入了用于Node.js应用程序开发的完整而…

域名DNS解析工具ping/nslookup/dig/host

常见 DNS 记录的类型 类型目的A地址记录&#xff0c;用来指定域名的 IPv4 地址&#xff0c;如果需要将域名指向一个 IP 地址&#xff0c;就需要添加 A 记录。AAAA用来指定主机名(或域名)对应的 IPv6 地址记录。CNAME如果需要将域名指向另一个域名&#xff0c;再由另一个域名提供…

RegularExpressionValidator 常用

RegularExpressionValidator 控件用于验证输入值是否匹配正则表达式指定的模式 属性&#xff1a; ControlToValidate"要验证的控件名称" ValidationExpression"验证规则" ErrorMessage"所要显示的错误信息" text“当验证失败时显示的消息。” Fo…

Gitlab添加SSH密钥的解决办法

打开git bash here, 注意期间“输入密码&#xff08;空没有密码&#xff09;&#xff1a;再次输入密码]&#xff1a;[键入密码]&#xff03;再次输入相同的密码”&#xff0c;如下&#xff1a; “Enter passphrase (empty for no passphrase): [Type a passphrase] # Enter sa…

TLS/SSl相关的攻击漏洞及检测方法大杂烩!

TLS/SSl相关的攻击漏洞及检测方法大杂烩&#xff01; 曾以为爱可以排除万难,可万难过后,又有万难。 漏洞介绍&#xff1a; TLS/SSL介绍&#xff1a; SSL“安全套接层”协议&#xff0c;TLS“安全传输层”协议&#xff0c;都属于是加密协议&#xff0c;在其网络数据传输中起到…

gitlab或者gitee生成/添加SSH公钥的解决办法

打开Git Bash Here, gitlab或者Gitee 提供了基于SSH协议的Git服务,在使用SSH协议访问仓库仓库之前,需要先配置好账户/仓库的SSH公钥。 你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" # Generating public/private rsa key pair... …

数据结构与算法——选择排序

//选择排序#include<stdio.h>void SelectSort(int arr[],int len);int main(void){ int i; int arr[9]{1,4,2,4,6,8,3,9,5}; int lensizeof(arr)/sizeof(arr[0]); SelectSort(arr,len); for(i0;i<len;i) { printf("%d ",arr[i]); }}void SelectSort(int arr…

点击劫持漏洞

1、漏洞理解 点击劫持&#xff08;Click Jacking&#xff09;是一种视觉上的欺骗手段&#xff0c;攻击者通过使用一个透明的iframe&#xff0c;覆盖在一个网页上&#xff0c;然后诱使用户在该页面上进行操作&#xff0c;通过调整iframe页面的位置&#xff0c;可以使得伪造的页面…

在 Gitee 上使用 GPG公钥(Beta版)

Windows 下载 https://gpg4win.org/ 生成 GPG Key 选择免费版的下载&#xff0c;无脑安装即可。 安装成功打开文件。 新建文件&#xff0c;创建个人密钥对&#xff0c;点击确认 输入码云的用户名及邮箱&#xff0c;一定要对应 输入完成可能需要输入或者创建密码&#xff0c;使…

javafx 值对_我今天对JavaFX的了解

javafx 值对如果您还没有听说过&#xff0c;JavaFX 2是Java的新Desktop / web / client框架。 自JavaFX 1以来&#xff0c;它已经进行了相当大的改动&#xff08;坦率地说&#xff0c;效果不那么令人印象深刻&#xff09;。 自定义脚本语言已经淘汰了&#xff0c;您可以使用标准…

Microsoft Windows MHTML脚本代码注入漏洞 (MS11-026) (CVE-2011-0096)

一、基本情况 漏洞级别&#xff1a;中危 漏洞类别&#xff1a;session操纵漏洞 二、问题描述 ApacheTomcat默认安装页面中存在examples样例目录。里面存放着Servlets、JSP、WebSocket的一些服务脚本和接口等样例。Servletsexamples服务样例下存在一个session的样例。该样例可…

我是如何解决gitlab 命令行上传需要输密码

使用如下两个命令得到pub文件内容&#xff0c;复制粘贴。 把上面得ssh-rsa后面一大串复制过来即可。 重新push代码。

android应用的界面编程----View与ViewGroup的概念

1 UI OverView Android中所有的UI元素都是通过View与ViewGroup来构建的&#xff0c;View是指屏幕中一块可与用户进行交互的空白&#xff0c;类似于java界面编程中的JPanel。为了界面布局&#xff0c;A Group对象可以包含多个View或ViewGroup&#xff08;由于ViewGroup是View的子…

比较散列策略

总览 编年史有许多用于哈希的实现&#xff0c;包括City和Murmur。 它也有自己的香草哈希&#xff0c;但是如何进行测试&#xff1f; 什么是香草哈希&#xff1f; Vanilla Hash设计得尽可能简单&#xff0c;并且针对Orthogonal Bits测试进行了优化&#xff08;请参见下文&#…

心脏滴血漏洞详解及利用--HeartBleed With OpenSSL

【事件规则】 OpenSSL“心脏出血”漏洞是一个非常严重的问题。这个漏洞使攻击者能够从内存中读取多达64 KB的数据。也就是说&#xff0c;只要有这个漏洞的存在&#xff0c;在无需任何特权信息或身份验证的环境下&#xff0c;我们就可以从我们自己的&#xff08;测试机上&#…

npm ERR! the command again as root/Administrator

以管理员身份运行。 顺便测试一下git bash和cmd安装nmp intall,测试他们之间的关系&#xff0c;发现git bash应该比cmd命令更丰富一点&#xff0c;推荐使用git bash.

Nmap常用命令

1、扫描单个目标地址&#xff1a; Nmap 192.168.128.30 2、扫描多个目标地&#xff1a; Nmap 192.168.128.130 192.168.128.129 3、扫描一个范围内的目标地址&#xff1a; Nmap 192.168.128.129-130 4、扫描目标地址所在的某个网段 Nmap 192.168.128.130/24 5、扫描主机列表1.t…