编组和解组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被设置为比JAXP替代品(例如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实现使JAXB更加清洁相关推荐

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

    moxy json介绍 编组和解组XML时使用JAXB的主要优点是编程模型. 只需注释几个POJO并使用JAXB API,您就可以很容易地序列化为XML和从XML反序列化. 您无需担心有关XML如何编 ...

  2. GlassFish 3.1.2充满了MOXy(EclipseLink JAXB)

    我非常高兴地宣布, EclipseLink JAXB(MOXy)现在是GlassFish 3.1.2中的JAXB( JSR-222 )提供程序. 我要感谢EclipseLink和GlassFish提交 ...

  3. moxy json介绍_MOXy的对象图和动态JAXB

    moxy json介绍 JAXB(JSR-222)使您可以轻松地将域类的实例转换为XML. EclipseLink MOXy实现提供了一个称为Dynamic JAXB的扩展,在其中,您可以使用诸如Dy ...

  4. MOXy的对象图和动态JAXB

    JAXB(JSR-222)使您可以轻松地将域类的实例转换为XML. EclipseLink MOXy实现提供了一个称为Dynamic JAXB的扩展,在其中,您没有像真实类那样的映射实例,例如名为Dy ...

  5. eclipselink_EclipseLink MOXy作为JAXB提供者

    eclipselink EclipseLink MOXy是JAXB提供程序,并且是内置在JDK中的默认JAXB提供程序的引人注目的替代品. 首先是一个简单的测试,将Java对象编组为XML: 这是模型 ...

  6. EclipseLink MOXy作为JAXB提供者

    EclipseLink MOXy是JAXB提供程序,并且是内置在JDK中的默认JAXB提供程序的引人注目的替代品. 首先是一个简单的测试,将Java对象编组为XML: 这是模型: @XmlRootEl ...

  7. eclipselink_EclipseLink MOXy和用于JSON处理的Java API –对象模型API

    eclipselink 用于JSON处理的Java API(JSR-353)是作为Java EE 7的一部分引入的用于生成和使用JSON的Java标准.JSR-353包括对象(类似于DOM)和流(类似 ...

  8. EclipseLink MOXy和用于JSON处理的Java API –对象模型API

    用于JSON处理的Java API(JSR-353)是用于生成和使用JSON的Java标准,它是Java EE 7的一部分引入.JSR-353包括对象(类似于DOM)和流(类似于StAX)API. 在 ...

  9. jax-rs jax-ws_通过JAX-WS Provider在Web服务中利用MOXy

    jax-rs jax-ws 在以前的文章中,我演示了如何将EclipseLink JAXB(MOXy)直接集成到WebLogic(从12.1.1开始)和GlassFish(从3.1.2开始)的JAX- ...

最新文章

  1. 2020中国一流大学名单(27所)和中国大学综合实力300强出炉!
  2. Qt探秘——谈ui文件的用法
  3. ST17H26开发小总结
  4. SAP 电商云 Spartacus UI 修改 Delivery Mode 触发的三个 HTTP 请求
  5. 教你玩转CSS 轮廓(outline)属性
  6. 计算机组成原理知识点白中英,计算机组成原理重点整理(白中英版) 考试必备
  7. [转] Difference between Abstract classes and Interfaces
  8. Eucalyptus的结构
  9. 《UML系统分析与设计》习题答案
  10. 关于永洪BI Kerberos机制的详细介绍
  11. excel表格横向纵向变换_excel2016如何把纵向的数据变为横向
  12. 四足机器人站立姿态解算-几何方法
  13. oppo开启系统更新服务器,oppo手机系统升级开不了机怎么办
  14. 【OCM第18期开班】第18期11g OCM培训将于8月23日,晚20点在腾讯课堂开班,第1场考试免费培训!!!...
  15. CodeRush and Refactor! Pro Version 3.2.3 for Visual Studio .NET
  16. 致远SPM解决方案之安全管理
  17. C语言实现计算机网络技术
  18. IDEA好用的插件推荐
  19. 计算机网络测试仪,网络测试仪如何使用
  20. 一款小巧的kafka测试工具

热门文章

  1. java多态+多态中隐含的问题
  2. rabbitmq 传递文件_使用RabbitMQ进行消息传递
  3. jdbc连接gp单例模式_JDBC连接备忘单
  4. java基准测试_星期五基准功能Java
  5. javafx 8u40_JavaFX 8u20天的未来过去(始终在最前面)
  6. lucene 多个分词查找_使用Lucene的新FreeTextSuggester查找长尾建议
  7. 无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)
  8. Spock 1.2 –轻松进行集成测试中的Spring Bean模拟
  9. 用于从文件读取/写入字符串的新JDK 11文件方法
  10. hibernate 继承_Hibernate继承:每个类层次结构的表