MOXy的对象图和动态JAXB

JAXB(JSR-222)使您可以轻松地将域类的实例转换为XML。 EclipseLink MOXy实现提供了一个称为Dynamic JAXB的扩展,在其中,您没有像真实类那样的映射实例,例如名为DynamicEntity的类。 您可以使用采用属性名称的get和set方法(即customer.get(“ address”)customer.set('name“,” Jane Doe“)来访问DynamicEntity上的数据。在本文中,我们首先将基于外部映射文件引导动态JAXBContext ,然后将XML文档解组到动态实体,最后将应用对象图来确定结果JSON输出的范围。

您可以从2013年3月24日开始从每晚下载EclipseLink 2.5.0每晚下载,以尝试这一点:

  • http://www.eclipse.org/eclipselink/downloads/nightly.php

动态Java模型

对于静态模型,元数据是从Java类派生的,并通过提供的任何元数据进行扩充(请参阅: JAXB –不需要注释 )。 由于在MOXy的动态JAXB中没有域类,因此类型必须完全由元数据定义。 可以从XML模式完成此操作,也可以在本示例中使用MOXy的外部映射文档完成此操作。

oxm.xml

由于没有真正的Java类,因此在外部映射文档中,我们需要指定每个映射,并为每个映射指定Java属性的类型。

<?xml version="1.0"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"package-name="blog.objectgraphs.dynamic"><java-types><java-type name="Customer"><xml-named-object-graphs><xml-named-object-graph name="contact info"><xml-named-attribute-node name="name"/><xml-named-attribute-node name="billingAddress" subgraph="location"/><xml-named-attribute-node name="phoneNumbers" subgraph="simple"/><xml-named-subgraph name="location"><xml-named-attribute-node name="city"/><xml-named-attribute-node name="province"/></xml-named-subgraph></xml-named-object-graph></xml-named-object-graphs><xml-root-element/><java-attributes><xml-attribute java-attribute="id" type="java.lang.Integer"/><xml-element java-attribute="name" type="java.lang.String"/><xml-element java-attribute="billingAddress" type="blog.objectgraphs.dynamic.Address"/><xml-element java-attribute="shippingAddress" type="blog.objectgraphs.dynamic.Address"/><xml-element java-attribute="phoneNumbers" name="phoneNumber" type="blog.objectgraphs.dynamic.PhoneNumber" container-type="java.util.List"><xml-element-wrapper/></xml-element></java-attributes></java-type><java-type name="Address"><java-attributes><xml-element java-attribute="street" type="java.lang.String"/><xml-element java-attribute="city" type="java.lang.String"/><xml-element java-attribute="province" type="java.lang.String"/><xml-element java-attribute="postalCode" type="java.lang.String"/></java-attributes></java-type><java-type name="PhoneNumber"><xml-named-object-graphs><xml-named-object-graph name="simple"><xml-named-attribute-node name="value"/></xml-named-object-graph></xml-named-object-graphs><java-attributes><xml-attribute java-attribute="type" type="java.lang.String"/><xml-value java-attribute="value" type="java.lang.String"/></java-attributes></java-type></java-types>
</xml-bindings>

jaxb.properties

jaxb.properties文件用于指定JAXB提供程序。 对于动态JAXB,此文件的内容与使用MOXy时的通常内容略有不同(与将EclipseLink MOXy指定为JAXB Provider相比 )。 该文件与域模型放在同一包中,因为这里有一个虚拟域模型, jaxb.properties文件将是blog.objectgraphs.dynamic包中唯一的真实项目。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory

示范代码

下面,我们将探讨使用对象图的两种不同方法。

演示–通过元数据指定的对象图

在下面的演示代码中,我们将利用外部映射文档中定义的对象图。 为动态模型定义的对象图与为静态模型定义的对象图完全相同(请参阅: MOXy的对象图– XML和JSON的输入/输出局部模型 )。 唯一不同的是,我们从解组调用中获得的对象是DynamicEntity的实例,而不是Customer的实例。

package blog.objectgraphs.dynamic;import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.jaxb.MarshallerProperties;public class DemoMetadata {public static void main(String[] args) throws Exception {Map<String, Object> properties = new HashMap<String, Object>(1);properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "blog/objectgraphs/dynamic/oxm.xml");JAXBContext jc = JAXBContext.newInstance("blog.objectgraphs.dynamic", DemoMetadata.class.getClassLoader(), properties);Unmarshaller unmarshaller = jc.createUnmarshaller();File xml = new File("src/blog/objectgraphs/dynamic/input.xml");DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(xml);// Output XMLMarshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.marshal(customer, System.out);// Output XML - Based on Object Graphmarshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "contact info");marshaller.marshal(customer, System.out);// Output JSON - Based on Object Graphmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);marshaller.setProperty(MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);marshaller.marshal(customer, System.out);}}

演示–以编程方式创建的对象图

在下面的演示代码中,我们将以编程方式创建对象图。 为动态模型创建的对象图与为相应静态模型创建的对象图完全相同(请参阅: MOXy的对象差距–从XML和JSON快速往返于部分模型 )。 不同之处在于,我们使用动态实体的名称而非类来创建对象图,并且从解组调用中获取了DynamicEntity的实例而不是Customer

package blog.objectgraphs.dynamic;import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.jaxb.JAXBHelper;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.jaxb.ObjectGraph;
import org.eclipse.persistence.jaxb.Subgraph;public class DemoRuntime {public static void main(String[] args) throws Exception {Map<String, Object> properties = new HashMap<String, Object>(1);properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "blog/objectgraphs/dynamic/oxm.xml");JAXBContext jc = JAXBContext.newInstance("blog.objectgraphs.dynamic", DemoMetadata.class.getClassLoader(), properties);Unmarshaller unmarshaller = jc.createUnmarshaller();File xml = new File("src/blog/objectgraphs/dynamic/input.xml");DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(xml);// Output XMLMarshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.marshal(customer, System.out);// Create the Object GraphObjectGraph contactInfo = JAXBHelper.getJAXBContext(jc).createObjectGraph("blog.objectgraphs.dynamic.Customer");contactInfo.addAttributeNodes("name");Subgraph location = contactInfo.addSubgraph("billingAddress");location.addAttributeNodes("city", "province");Subgraph simple = contactInfo.addSubgraph("phoneNumbers");simple.addAttributeNodes("value");// Output XML - Based on Object Graphmarshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, contactInfo);marshaller.marshal(customer, System.out);// Output JSON - Based on Object Graphmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);marshaller.setProperty(MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);marshaller.marshal(customer, System.out);}}

输入输出

对于元数据驱动的演示和程序化演示,以下输入和输出相同。

input.xml /输出

我们将使用以下文档来填充我们的域模型。 我们还将撤回封送它,以证明所有内容均已实际映射。

<?xml version="1.0" encoding="UTF-8"?>
<customer id="123"><name>Jane Doe</name><billingAddress><street>1 A Street</street><city>Any Town</city><province>Ontario</province><postalCode>A1B 2C3</postalCode></billingAddress><shippingAddress><street>2 B Road</street><city>Another Place</city><province>Quebec</province><postalCode>X7Y 8Z9</postalCode></shippingAddress><phoneNumbers><phoneNumber type="work">555-1111</phoneNumber><phoneNumber type="home">555-2222</phoneNumber></phoneNumbers>
</customer>

基于对象图的XML输出

下面的XML由与先前XML文档完全相同的模型生成。 不同之处在于,我们利用对象图来选择映射内容的子集。

<?xml version="1.0" encoding="UTF-8"?>
<customer><name>Jane Doe</name><billingAddress><city>Any Town</city><province>Ontario</province></billingAddress><phoneNumbers><phoneNumber>555-1111</phoneNumber><phoneNumber>555-2222</phoneNumber></phoneNumbers>
</customer>

基于对象图的JSON输出

以下是与先前以JSON表示的XML文档相同的子集。 我们使用了新的JSON_WRAPPER_AS_ARRAY_NAME属性(请参阅绑定到JSON&XML –处理集合 )来改善集合值的表示形式。

{"name" : "Jane Doe","billingAddress" : {"city" : "Any Town","province" : "Ontario"},"phoneNumbers" : [ "555-1111", "555-2222" ]
}

参考: Java XML和JSON绑定博客中的JCG合作伙伴 Blaise Doughan的MOXy的对象图和动态JAXB 。

翻译自: https://www.javacodegeeks.com/2013/04/moxys-object-graphs-dynamic-jaxb.html

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

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

相关文章

Processing-Shader-Examples

https://github.com/genekogan/Processing-Shader-Examples 转载于:https://www.cnblogs.com/guochen/p/7681278.html

随记

pip list 查看python所有的安装软件 pip uninstall 卸载 pip3 install 安装 pip install pip -V 查看pip版本 pip install --upgrade pip 对pip升级转载于:https://www.cnblogs.com/zqxqx/p/8906206.html

mysql时间函数总结_MySQL 日期时间函数常用总结

获得当前日期时间(date time)1.1 函数&#xff1a;now()相关函数&#xff1a;current_timestamp()&#xff0c;localtime()&#xff0c;localtimestamp()举例说明&#xff1a;2. 获得当前日期(date)函数&#xff1a;curdate()相关函数&#xff1a;current_date()&#xff0…

Apache CXF – JAX-WS –简单教程

许多Java开发人员认为Web Service实现的任务艰巨-没人能真正责怪他们&#xff0c;尤其是在企业应用程序开发的多年中&#xff0c;这给开发和设计带来了很多复杂性。 对于某些人来说&#xff0c;了解它是构建完整的企业应用程序的下一步-Web服务-是实现面向服务设计的关键方案之…

Linux学习(一)--基本概念

一、Linux概述 Linux是一款全球性的免费的开源的操作系统平台&#xff0c;其特点是实现了多任务多用户处理&#xff0c;主要是依赖内核kernel shell&#xff0c;且占用资源少 &#xff08;最小配置只要4Mb内存就能运行&#xff09;。百度百科概述 Linux是一套免费使用和自由传播…

Java StringBuilder神话被揭穿

神话 用加号运算符连接两个字符串是万恶之源 -匿名Java开发人员 注意 &#xff1a;此处讨论的测试的源代码可以在Github上找到 从大学时代起&#xff0c;我就学会了使用运算符将Java中的String连接视为致命的性能缺陷。 最近&#xff0c;在Backbase R&#xff06;D上进行了一…

UOJ #149. 【NOIP2015】子串

有两个仅包含小写英文字母的字符串 A 和 B。 现在要从字符串 A 中取出 k 个互不重叠的非空子串&#xff0c;然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串。请问有多少种方案可以使得这个新串与字符串 B 相等&#xff1f; 注意&#xff1a;子…

一张正方形图片,伴随我一年半,敢问情绪的使用方法

【问题的由来】 图片适配正方形显示方法一 <style> .box{width:400px;height:400px;border:solid 5px red;margin:0 auto;background:#f4f4f4 url() no-repeat center;background-size:cover;} </style> <div class"box" style"background-imag…

java3d创建立方体_Opengl创建几何实体——四棱锥和立方体

//#include #include #include using namespace std;float rtri;float rquad;GLfloat points0[5][3] { {0,1,0},{-1,-1,1},{1,-1,1},{1,-1,-1},{-1,-1,-1} };GLfloat points1[8][3] { {1,1,-1},{-1,1,-1},{-1,1,1},{1,1,1},{1,-1,1},{-1,-1,1},{-1,-1,-1},{1,-1,-1} };//四棱…

《软件需求十步走》阅读笔记06

开发因需求而来&#xff0c;需求开发以需求规划的成果为主要依据。软件需求开发首先要做的是获取需求&#xff0c;得到目标&#xff0c;系统关联情况以及用例的分析&#xff1b;其次是需求分析&#xff0c;软件系统的可行性&#xff0c;用户接口&#xff0c;系统功能&#xff0…

WSO2 ESB的一种消息传递方式

正如我之前在WSO2 ESB工作时所发布的那样。 为了更好地理解此ESB&#xff0c;我一直在浏览示例 &#xff08;尚未完成所有示例 &#xff09;。 示例12是关于与ESB的单向消息传递&#xff0c;并使用TCP监视器使其可见。 我之前已经介绍过如何设置类似的工具“ TcpTunnelGUI”&am…

Eclipse-Java代码规范和质量检查插件-Checkstyle

CheckStyle是SourceForge下的一个项目&#xff0c;提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程&#xff0c;从而使得开发人员从这项重要但枯燥的任务中解脱出来。它可以根据设置好的编码规则来检查代码。比如符合规范的变量命名&#xff…

HTML CSS基础

第一章 一、样式 1、行间样式&#xff0c;代码不可维护&#xff0c;不推荐 2、内联样式&#xff0c;不可重用&#xff0c;不推荐 3、外联样式&#xff0c;可重用&#xff0c;可维护&#xff0c;推荐 <link rel"stylesheet" href"...css" /> 二、…

2018-04-22接口自动化测试学习心得(1)

根据接口文档写接口测试用例-->添加接口自动化测试项目相关依赖(httpclienttestngpoi-ooxmllog4jmailmysql-connector-java)-->写接口测试方法-->执行测试 -- 接口测试1.一个接口就是一个函数2.我们要保证一个接口能够在url地址栏里面访问到&#xff0c;必须满足一下两…

Java MemoryMapped文件的功能

Java MemoryMapped文件的功能 在JDK 1.4中&#xff0c;将内存映射文件的有趣功能添加到Java中&#xff0c;该功能允许将任何文件映射到OS内存以进行有效读取。 内存映射文件可用于开发IPC类型的解决方案。 本文是使用内存映射文件创建IPC的实验。 有关内存映射文件的一些详细信…

介绍一款好用 mongodb 可视化工具

最近想自己搭建一个个人博客&#xff0c;所以学了下mongodb&#xff0c;mongodb是用命令行输入的&#xff0c;有些人可能不太习惯&#xff0c;我自己找了下mongodb的一些可视化工具&#xff0c;发现了一款adminmongo很好用&#xff0c;这里介绍给你们用一下。 github地址&#…

用CSS3来代替JS实现交互

【CSS3和JS】 对于CSS了解的同学都知道&#xff0c;CSS的实现是最底层的&#xff0c;在实现方式和性能上都不是&#xff0c;JS这种提供接口的脚本可比的&#xff1b;从CSS3的动画和JS动画对比角度来看两者&#xff0c;会更清晰&#xff1b;而且随着前端框架的使用&#xff0c;…

php 如何宏定义,php – 在html中实现宏定义的方法

也许显而易见,但C预处理器可以完成这项工作.index._html#define _em(a) a #define _image(a, b) #define _list(a, b, c) a \\ b \ c \#define _theTile The Bar Title#include "head._html"_list(foo, bar, bean)This is really _em(great)_image(media/cat.jpg, …

python——函数 11、命名空间

三种名称空间1、内置名称空间&#xff1a; python解释器自带的名字,如&#xff1a;print、sum、max 当解释器启动时就会形成这个空间 2、全局名称空间&#xff1a; 执行python程序时就会产生这个空间 在每行顶端写代码 a10 def foo():print(a) foo() View Code3&…

Hadoop如何工作? HDFS案例研究

Apache Hadoop软件库是一个框架&#xff0c;该框架允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。 它旨在从单个服务器扩展到数千台机器&#xff0c;每台机器都提供本地计算和存储。 库本身不用于依靠硬件来提供高可用性&#xff0c;而是被设计用来检测和处…