假设您有一个要公开为RESTful服务的域模型。 问题是您只想输入/输出部分数据。 以前,您将创建一个代表子集的单独模型,然后使用代码在模型之间移动数据。 在EclipseLink 2.5.0中,我们有一个称为“对象图”的新功能,使您能够轻松地在模型上定义局部视图。

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

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

Java模型

以下是我们将用于此示例的Java模型。 该模型表示客户数据。 我们将使用对象图来输出足够的信息,以便有人可以通过电话与客户联系。

顾客

@XmlNamedObjectGraph扩展用于指定我们希望编组/解组的模型的子集。 通过指定一个或多个@XmlNamedAttributeNode批注来完成。 如果要将对象图应用于属性,则可以为其指定子图。 可以将子图定义为目标类上的@XmlNamedSubgraph@XmlNamedObjectGraph

package blog.objectgraphs.metadata;import java.util.List;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;@XmlNamedObjectGraph(name='contact info',attributeNodes={@XmlNamedAttributeNode('name'),@XmlNamedAttributeNode(value='billingAddress', subgraph='location'),@XmlNamedAttributeNode(value='phoneNumbers', subgraph='simple')},subgraphs={@XmlNamedSubgraph(name='location',attributeNodes = { @XmlNamedAttributeNode('city'),@XmlNamedAttributeNode('province')})}
)
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {@XmlAttributeprivate int id;private String name;private Address billingAddress;private Address shippingAddress;@XmlElementWrapper@XmlElement(name='phoneNumber')private List<PhoneNumber> phoneNumbers;}

地址

因为我们将Address类的对象图定义为Customer类的子图,所以我们在这里不需要做任何事情。

package blog.objectgraphs.metadata;import javax.xml.bind.annotation.*;@XmlAccessorType(XmlAccessType.FIELD)
public class Address {private String street;private String city;private String province;private String postalCode;}

电话号码

对于Customer类的phoneNumbers属性,我们指定应使用一个名为simple的对象图来限定数据范围。 我们将在PhoneNumber类上定义此对象图。 这种方法的优点是它使对象图更易于重用。

package blog.objectgraphs.metadata;import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;@XmlNamedObjectGraph(name='simple',attributeNodes={@XmlNamedAttributeNode('value'),}
)
@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {@XmlAttributeprivate String type;@XmlValueprivate String value;}

示范代码

演示版

在下面的演示代码中,我们将阅读一个XML文档以完全填充我们的Java模型。 在将其编组起来以证明所有内容都已完全映射之后,我们将在封送处理程序上指定一个对象图(第22行),并将子集输出到XML和JSON。

package blog.objectgraphs.metadata;import java.io.File;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;public class Demo {public static void main(String[] args) throws Exception {JAXBContext jc = JAXBContext.newInstance(Customer.class);Unmarshaller unmarshaller = jc.createUnmarshaller();File xml = new File('src/blog/objectgraphs/metadata/input.xml');Customer customer = (Customer) 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);}}

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' ]
}

外部元数据

MOXy还提供了一个外部绑定文档,使您可以为第三方对象提供元数据或为模型应用备用映射(请参阅:将对象映射到多个XML模式–天气示例 )。 以下是此示例的映射文档。

<?xml version='1.0'?>
<xml-bindings xmlns='http://www.eclipse.org/eclipselink/xsds/persistence/oxm'package-name='blog.objectgraphs.metadata'xml-accessor-type='FIELD'><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'/><xml-element java-attribute='phoneNumbers' name='phoneNumber'><xml-element-wrapper/></xml-element></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'/><xml-value java-attribute='value'/></java-attributes></java-type></java-types>
</xml-bindings>

参考:来自Java的 JCG合作伙伴 Blaise Doughan的MOXy的对象图– XML和JSON的输入/输出局部模型,位于Java XML&JSON绑定博客中。

翻译自: https://www.javacodegeeks.com/2013/03/moxys-object-graphs-inputoutput-partial-models-to-xml-json.html

MOXy的对象图– XML和JSON的输入/输出局部模型相关推荐

  1. moxy json介绍_MOXy的对象图– XML和JSON的输入/输出局部模型

    moxy json介绍 假设您有一个要公开为RESTful服务的域模型. 问题是您只想输入/输出部分数据. 以前,您将创建一个代表子集的单独模型,然后使用代码在模型之间移动数据. 在EclipseLi ...

  2. MOXy的对象图和动态JAXB

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

  3. kryo java_优化Java序列化– Java,XML,JSON,Kryo,POF

    kryo java 也许我很天真,但是我一直认为Java序列化肯定是将Java对象序列化为二进制形式的最快,最有效的方法. 毕竟Java是第7个主要发行版,所以这不是新技术,而且由于每个JDK似乎都比 ...

  4. 优化Java序列化– Java,XML,JSON,Kryo,POF

    也许我很天真,但是我一直认为Java序列化肯定是将Java对象序列化为二进制形式的最快,最有效的方法. 毕竟Java是第7个主要发行版,所以这不是新技术,并且由于每个JDK似乎都比上一个快,因此我错误 ...

  5. json文件转为excel_2分钟上手、3小时学会无代码软件开发---XML、Json处理

    XML文件使用 合成XML格式文本 用Serialize XML(合成XML格式文本元件)将数据转换为XML文本 上例中我们先设计了一个数据结构并为数据结构中变量做了赋值处理数据结构作为输入对象传给S ...

  6. MOXy作为您的JAX-RS JSON提供程序–服务器端

    在以前的系列文章中,我介绍了如何利用EclipseLink JAXB(MOXy)创建RESTful数据访问服务. 在本文中,我将介绍在服务器端利用MOXy的新JSON绑定添加对基于JAXB映射的JSO ...

  7. MOXy作为您的JAX-RS JSON提供程序–客户端

    最近,我发布了如何利用EclipseLink JAXB(MOXy)的JSON绑定来创建RESTful服务. 在本文中,我将演示在客户端利用MOXy的JSON绑定有多么容易. MOXy作为您的JAX-R ...

  8. JavaSE——XML与JSON(语法格式、解析内容)

    第6节 XML与JSON 一.XML 1.1 XML简介 XML全称为可扩展标记语言(extensible Markup Language) . 特性: xml具有平台无关性,是一门独立的标记语言: ...

  9. OSB格式(REST)转化(XML到JSON,JSON到XML)

    OSB转换项目操作手册 新建一个OSB项目 建立以下文件夹,以便更规范的管理工程 一.XML转JSON 1.导入wsdl文件 1)右键wsdl文件夹,选择import选项 2)在弹出框中选择Servi ...

最新文章

  1. FireWork 制作android 应用程序 icon
  2. 用开源项目cropper实现对图片中任意部分进行裁剪
  3. 征战蓝桥 —— 2016年第七届 —— C/C++A组第3题——方格填数
  4. Servlet3.0 多图片,文件上传
  5. linux root权限_Linux 提权技术
  6. 【报告分享】中国创新生态发展报告2019-德勤.pdf
  7. 计算机组成实验八,计算机组成原理实验八内存系统实验
  8. mysql 使用内置函数来进行模糊搜索(locate()等)
  9. 前端框架(混合开发框架)
  10. python数据科学包第三天(股票数据分析、时间事件日志)
  11. span标签置灰_ant-desgin-vue——tree自定义不可选用的置灰或禁用
  12. 好玩又赚钱的链游有哪些?
  13. 实验六 配置GVRP协议
  14. AlphaMind:趋势跟踪及量化交易系统
  15. JavaScript-百炼成仙(第1节掌握JavaScript基础1.1-1.21)
  16. 对于DFA、NFA理解
  17. DJ3-5 死锁概述
  18. vue中使用微信jssdk语音聊天功能,实现语音输入内容的van-field输入框组件
  19. html 页面自适应table,HTML页面自适应宽度的table表格
  20. 央行出手救市 贷款利率和准备金率齐降

热门文章

  1. android url回调json,【求助】本地页面如何取某个URL返回的json
  2. Oracle 分页语句解释,oracle 分页语句
  3. cmw500综合测试仪使用_山西优质三相直流电阻测试仪图片-南电合创
  4. mybatis_user_guide(3)XML配置
  5. 求三个数的最大最小值
  6. kafka处理流式数据_通过Apache Kafka集成流式传输大数据
  7. 公证服务信息_使用多个公证员提高网络吞吐量
  8. jpa一级缓存和二级缓存_了解一级JPA缓存
  9. ebook_[EBOOK]十大Java性能问题
  10. npm 引用子项目模块_Java / Web项目中的NPM模块Browser-Sync