MOXy是GlassFish 4中新的默认JSON绑定提供程序

GlassFish 4现在可以提供完整的Java EE 7(JSR-342)平台。 EclipseLink为该发行版做出了一些重大贡献。 首先是提供JPA 2.1(JSR-338)实现。 我将在本文中介绍的第二个内容是EclipseLink MOXy,它现在是JAX-RS应用程序的默认JSON绑定提供程序。

RESTful服务

客户服务

通常,JPA将支持真实的服务以执行持久性操作(请参阅: 创建RESTful Web服务–第4/5部分 )。 但是对于这篇文章,我将使用“ Hello World”
样式服务,该服务基于ID作为XML和JSON返回一个Customer ,以说明有关绑定的一些要点。

package org.example.service;import javax.ejb.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import org.example.model.*;@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {@GET@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})@Path("{id}")public Customer read(@PathParam("id") int id) {Customer customer = new Customer();customer.setId(id);customer.setName("Jane Doe");PhoneNumber pn = new PhoneNumber();pn.setType("work");pn.setValue("5551111");customer.getPhoneNumbers().add(pn);return customer;}}

客户申请

我已经使用Application类来指定服务的路径。

package org.example.service;import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;@ApplicationPath("rest/*")
public class CustomerApplication  extends Application {}

Java模型

以下是我们将用于此示例的Java模型。 目标是使用一组元数据生成良好的XML和JSON表示形式。

顾客

关于Customer类,有几点有趣的事情要注意。

  1. id属性是一个int 。 由于JSON具有不同的数字和文本表示方式,因此我们将研究如何在JSON输出中表示该值。
  2. phoneNumbers属性的类型为List <PhoneNumber> 。 已使用@XmlElementWrapper对其进行注释,以产生良好的XML输出。 我们将研究这样做对JSON输出的影响。
package org.example.model;import java.util.*;
import javax.xml.bind.annotation.*;@XmlRootElement
public class Customer {private int id;private String name;private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@XmlElementWrapper@XmlElement(name="phoneNumber")public List<PhoneNumber> getPhoneNumbers() {return phoneNumbers;}}

电话号码

在XML中, PhoneNumber类映射到具有简单内容的复杂类型(请参阅: JAXB和具有简单内容的复杂类型 )。 这意味着它将映射到具有属性和文本的XML元素。 这些XML概念并不直接与JSON概念相对应,因此我们将研究JSON表示形式。

package org.example.model;import javax.xml.bind.annotation.*;public class PhoneNumber {private String type;private String value;@XmlAttributepublic String getType() {return type;}public void setType(String type) {this.type = type;}@XmlValuepublic String getValue() {return value;}public void setValue(String value) {this.value = value;}}

使用服务

要求– GET

以下是我们用于访问服务的URL:

http://localhost:8080/CustomerResource/rest/customers/1

响应(应用程序/ xml)

由于我们将域模型映射为
JAXB(JSR-222)元数据下面的XML表示并不奇怪。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="1"><name>Jane Doe</name><phoneNumbers><phoneNumber type="work">5551111</phoneNumber></phoneNumbers>
</customer>

响应(应用程序/ json)– GlassFish 3.1.2

让我们看看在MOXy是默认的JSON绑定提供程序之前,GlassFish 3.1.2中的JSON表示是什么样的。 有几件事要注意:

  1. id属性的int值表示为JSON文本。
  2. 类型为List <PhoneNumber>phoneNumbers属性
    因为它只有一个项目被表示为JSON对象而不是JSON数组。 即使此键包含一个集合,它仍称为phoneNumber
  3. 类型属性使用@XmlAttribute注释以来,与type属性相对应的JSON关键字以@ 开头
  4. 自从使用@XmlValue进行注释以来,与value属性对应的JSON密钥称为$
{"id": "1","name": "Jane Doe","phoneNumbers": {"phoneNumber": {"@type": "work","$": "5551111"}}
}

响应(应用程序/ json)– GlassFish 4

使用默认配置,您将看到升级到GlassFish 4消除了两个最大的问题:

  1. 数值–现在, id属性已作为数字值正确编组到JSON。 这不是技巧,MOXy将JSON表示形式基于属性的Java类型。 PhoneNumber实例上的String类型的value属性仅包含数字,并且已作为文本正确编组到JSON。
  2. 大小为1的集合– phoneNumber密钥现在是一个JSON数组,不幸的是,它仍称为phoneNumber (我将在接下来的示例中演示如何解决此问题)。
{"id": 1,"name": "Jane Doe","phoneNumbers": {"phoneNumber": ["@type": "work","$": "5551111"]}
}

自定义JSON绑定

现在可以通过利用JAX-RS ContextResolver机制来配置MOXy。 您只需要返回MOXyJsonConfig的实例。 我们将使用它来执行以下操作:

  1. 指定我们不想为与@XmlAttribute映射的属性相对应的JSON关键字添加前缀。
  2. 使用JSON关键 ,而不是$@XmlValue映射属性。
  3. MOXyJsonConfig也可以用于将属性向下传递给Marshaller / Unmarshaller。 我们将执行此操作以清理集合属性的JSON密钥(请参阅: 绑定到JSON&XML –处理集合 )。
package org.example.service;import javax.ws.rs.ext.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.glassfish.jersey.moxy.json.MoxyJsonConfig;@Provider
public class MOXyJsonContextResolver implements ContextResolver<MoxyJsonConfig> {private final MoxyJsonConfig config;public MOXyJsonContextResolver() {config = new MoxyJsonConfig().setAttributePrefix("").setValueWrapper("value").property(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);}@Overridepublic MoxyJsonConfig getContext(Class<?> objectType) {return config;}}

新回应

最后,我们有一个我们可以满意的JSON表示形式。 它不包含任何与XML相关的工件,即使它是使用与XML表示相同的元数据生成的(未更改)。 只需要一点点MOXy。

{"id": 1,"name": "Jane Doe","phoneNumbers": [{"type": "work","value": "5551111"}]
}

参考: MOXy是GlassFish 4中新的默认JSON绑定提供程序,来自我们的JCG合作伙伴 Blaise Doughan,来自Java XML&JSON Binding博客。

翻译自: https://www.javacodegeeks.com/2013/06/moxy-is-the-new-default-json-binding-provider-in-glassfish-4.html

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

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

相关文章

假期第四周周总结

第四周&#xff1a; 本周做了什么&#xff1a;由于第一次科三没过&#xff0c;只能再约一次&#xff0c;两天在练科三&#xff0c;其他时间都在安装oracle&#xff0c;虚拟机&#xff0c;并配置环境&#xff0c;学习oracle数据库&#xff0c;并改进河北创新科技平台系统 收获是…

通过form实现enter事件

结构 <form action‘#’> <input typesearch /> <button>搜索</button> </form> 在这种情况下即使给button加上事件&#xff0c;按enter键也会执行点击事件中的代码&#xff08;pc-移动web皆可以&#xff09;。&#xff08;action需为javascript…

CSS3之background的调整和增加的属性

对于background做了一些修改&#xff0c;最明显的一个就是采用设置多背景&#xff0c;不但添加了4个新属性&#xff0c;并且还对目前的属性进行了调整增强。 1、多个背景图片 在css3里面&#xff0c;你可以再一个标签元素里应用多个背景图片。代码类似与css2.0版本的写法&…

html 天气特效,用CSS制作天气特效动画,源码分享

效果图今天给大家带来的是CSS3动画天气图标代码&#xff0c;简单实用好看&#xff01;CSS源码&#xff1a;html { box-sizing: border-box; }html *,html *:before,html *:after { box-sizing: inherit; }body {max-width: 42em;padding: 2em;margin: 0 auto;color: #161616;fo…

做折线图坐标轴数字_Excel折线图表的另类表达制作?牛闪君使用了双线表达法来完成...

牛闪闪办公第846个原创技巧Zloffice社群的小伙伴还是很爱学习的&#xff0c;这不&#xff0c;有一位小伙伴看到“特殊”图表表达&#xff0c;想知道是怎么做出来的。这种学习的思路非常好&#xff0c;看到好的表达就想学习&#xff0c;这是非常好的收集习惯&#xff0c;能够积累…

Spring MVC控制器的单元测试:“普通”控制器

本教程的第一部分描述了如何配置使用Spring MVC Test框架的单元测试 。 现在是时候动手做&#xff0c;学习如何为“常规”控制器编写单元测试了。 显而易见的下一个问题是&#xff1a; 什么是普通控制器&#xff1f; 好吧&#xff0c;一个普通的控制器&#xff08;在此博客文…

回溯法

一、概念&#xff1a;回溯法也是一种枚举&#xff0c;但是回溯法将枚举(生成&#xff09;和检查有机结合起来&#xff0c;从而减少了不必要的枚举。。 二、经典八皇后问题。 #include<iostream> #include<cmath> using namespace std;int vis[100]; int store[100]…

【Spring】入门HelloWorld

参考&#xff1a;https://www.yiibai.com/spring/spring-tutorial-for-beginners.html 一、创建项目 1.利用IntelliJ创建Maven项目2.配置pom.xml,引入Spring <?xml version"1.0" encoding"UTF-8"?> 4.0.0 <groupId>com.jh</groupId> &…

html属性可以用来定义内联样式,18年6月考试《网页设计与制作》期末大作业.doc...

...(单选题) 1: 以下HTML代码&#xff0c;判断正确的是( )。 A: 错了B: “button”双引号错了(应为单引号)C: 第2、3行应加入…….D: 没有错误正确答案:(单选题) 2: 数据库的基本操作是( )。A: 增&#xff0c;删&#xff0c;改&#xff0c;查B: 增&#xff0c;删&#xff0c;加…

DIV CSS初学者需重视的10个简单问题与技巧

DIVCSS初学者往往感觉自己遇到很多莫明其妙的问题&#xff0c;其实只是一些小细节没有引起重视&#xff0c;下面罗列了10个问题与技巧&#xff0c;温故而知新。 一、检查HTML元素是否有拼写错误、是否忘记结束标记即使是老手也经常会弄错div的嵌套关系。可以用dreamweaver的验…

Spring MVC:表单处理卷。 5 –选择,选项,选项标签

下拉列表是Web表单中最常见的元素之一。 在HTML中&#xff0c;可以使用适当的标签创建此类控件&#xff1a; <form&#xff1a;select> –下拉列表的父标签和<form&#xff1a;option> – <form&#xff1a;select>标签的子标签。 Spring MVC标签库为下拉列表…

06.linux平台下运行go文件

1.获取linux位数 getconf LONG_BIT 2.下载地址&#xff1a; https://studygolang.com/dl 3.解压安装包 sudo tar -xzf go1.9.2.linux-amd64.tar.gz -C /usr/local 4.设置环境变量 sudo vi /etc/profile export GOROOT/usr/local/go export GOBIN$GOROOT/bin export GOPATH/h…

python3读取ini文件_python3配置文件ini读取方法

1.最常用的Plain text形式的配置文件 1.1首选 .init 文件 标准库 configparser 1.2次选 csv文件 与 Unix/Linux 下常用的 xx xxx形式的配置文件 分别是标准库csv 与 shlex 2.最常用的二进制级配置文件 2.1持久化数据首选shelve 标准库 shelve 2.2shelve的对于一些项目我们需要…

Python的看门狗实现自动化实时对服务器、Windows或Linux文件夹的实时监控

众所周知&#xff0c;在运维过程中&#xff0c;实时获取目标文件夹至关重要&#xff0c;Python的watchdog是用程序来监视文件系统事件Python库&#xff0c;所以用该库可以实现对文件夹的实时监控&#xff0c;filenotify.py代码如下&#xff1a; # -*- coding: utf-8 -*- #!/usr…

在html中样式表的三种类型,css样式有哪几种类型?

CSS样式可以写在哪些地方呢&#xff1f;从CSS 样式代码插入的形式来看基本可以分为以下3种&#xff1a;内联式、嵌入式和外部式三种。下面本篇文章就来给大家介绍一下CSS样式的类型&#xff0c;希望对大家有所帮助。内联式样式内联式css样式表就是把css代码直接写在现有的HTML标…

DIV CSS浏览器的兼容性

1. 文字本身的大小不兼容。同样是font-size:14px的宋体文字&#xff0c;在不同浏览器下占的空间是不一样的&#xff0c;ie下实际占高16px&#xff0c;下留白3px&#xff0c;ff 下实际占高17px&#xff0c;上留白1px&#xff0c;下留白3px&#xff0c;opera下就更不一样了。解决…

记录合规性–关于TCK,规格和测试

使用软件规格非常困难。 不论在哪个地方提出&#xff1b; 您最终遇到了一个大问题&#xff1a;是否已实施并测试了所有指定的内容&#xff1f; 在瀑布驱动的方法学时代&#xff0c;这一直是一个问题&#xff0c;即使在撰写本文的今天&#xff0c;敏捷性和用户故事仍然不能保证您…

arcgis已试图对空几何执行该操作_ArcGIS中地理配准与空间校正的不同

ArcGIS中地理配准与空间校正都是用于数据坐标变换的目的&#xff0c;他们之间有什么区别呢&#xff1f;1、处理对象不同&#xff1a;地理配准针对栅格数据&#xff0c;而空间校正针对矢量数据。因此空间校正需要建立在矢量数据编辑的基础上&#xff0c;空间校正之前应开始编辑。…

【计算机视觉】深度学习视觉领域常用数据集汇总

本文结合笔者在研究生学习、科研期间使用过以及阅读文献了解到的深度学习视觉领域常用的开源数据集&#xff0c;进行介绍和汇总。MNIST深度学习领域的“Hello World!”&#xff0c;入门必备&#xff01;MNIST是一个手写数字数据库&#xff0c;它有60000个训练样本集和10000个测…

CSS Hack 汇总速查一览

由于浏览器之间存在兼容性问题&#xff0c;在制作网页的时候&#xff0c;为了使页面能在不同浏览器中显示相对一致或者其他原因&#xff0c;网页制作人员总结了种种 Hack 方法&#xff1b;在解 决兼容性问题之前&#xff0c;这些方法还经常会用到。接下来&#xff0c;大前端将给…