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

在以前的系列文章中,我介绍了如何利用EclipseLink JAXB(MOXy)创建RESTful数据访问服务。 在本文中,我将介绍在服务器端利用MOXy的新JSON绑定添加对基于JAXB映射的JSON消息的支持有多么容易。
  • MOXy作为您的JAX-RS JSON提供程序–服务器端
  • MOXy作为您的JAX-RS JSON提供程序–客户端

为什么选择EclipseLink JAXB(MOXy)?

以下是将MOXy用作JSON绑定提供程序的一些优点:

  • JSON绑定提供程序中对JAXB注释的最广泛支持。
  • 支持XML和JSON: 绑定到JSON和XML – Geocode示例 。
  • MOXy包含@XmlInverseReference之类的扩展名,用于将JPA实体映射到JSON和XML: 第3部分–将JPA实体映射到XML(使用JAXB) 。
  • 外部映射文档可作为注释的替代方法: JAX-RS Service中的MOXy的XML元数据 。

客户服务

使用@Produces和@Consumes批注控制JAX-RS服务理解的消息类型。 在这篇文章中,我指定了除“ application / xml”外,所有操作现在都支持“ application / json”。 以下帖子提供了对该服务的更详细描述: 创建RESTful Web服务–第4/5部分 。

package org.example;import java.util.List;
import javax.ejb.*;
import javax.persistence.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {@PersistenceContext(unitName="CustomerService",type=PersistenceContextType.TRANSACTION)EntityManager entityManager;@POST@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})public void create(Customer customer) {entityManager.persist(customer);}@GET@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})@Path("{id}")public Customer read(@PathParam("id") long id) {return entityManager.find(Customer.class, id);}@PUT@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})public void update(Customer customer) {entityManager.merge(customer);}@DELETE@Path("{id}")public void delete(@PathParam("id") long id) {Customer customer = read(id);if(null != customer) {entityManager.remove(customer);}}@GET@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})@Path("findCustomersByCity/{city}")public List<Customer> findCustomersByCity(@PathParam("city") String city) {Query query = entityManager.createNamedQuery("findCustomersByCity");query.setParameter("city", city);return query.getResultList();}}

MOXyJSONProvider

我们将实现JAX-RS MessageBodyReader / MessageBodyWriter,以插件支持MOXy的JSON绑定。 此实现足够通用,可以直接使用MOXy作为JAXB提供程序为任何JAX-RS服务启用JSON绑定。 一些有趣的注意事项:

  • MOXy没有编译时间依赖性。
  • eclipselink.media-type属性用于在unmarshaller(第34行)和marshaller(第55行)上启用JSON绑定。
  • eclipselink.json.include-root属性用于指示@XmlRootElement批注在JSON绑定中应被忽略(第35和56行)。
  • 创建JAXBContext时,代码首先检查以查看是否已为此类型注册JAXBContext(第70和71行)。 如果要利用MOXy的外部映射文档: JAX-RS Service中的MOXy的XML元数据,这将很有用。
package org.example;import java.io.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.*;
import javax.xml.transform.stream.StreamSource;import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.ws.rs.ext.*;
import javax.xml.bind.*;@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class MOXyJSONProvider implementsMessageBodyReader<Object>, MessageBodyWriter<Object>{@Contextprotected Providers providers;public boolean isReadable(Class<?> type, Type genericType,Annotation[] annotations, MediaType mediaType) {return true;}public Object readFrom(Class<Object> type, Type genericType,Annotation[] annotations, MediaType mediaType,MultivaluedMap<String, String> httpHeaders, InputStream entityStream)throws IOException, WebApplicationException {try {Class<?> domainClass = getDomainClass(genericType);Unmarshaller u = getJAXBContext(domainClass, mediaType).createUnmarshaller();u.setProperty("eclipselink.media-type", mediaType.toString());u.setProperty("eclipselink.json.include-root", false);return u.unmarshal(new StreamSource(entityStream), domainClass).getValue();} catch(JAXBException jaxbException) {throw new WebApplicationException(jaxbException);}}public boolean isWriteable(Class<?> type, Type genericType,Annotation[] annotations, MediaType mediaType) {return true;}public void writeTo(Object object, Class<?> type, Type genericType,Annotation[] annotations, MediaType mediaType,MultivaluedMap<String, Object> httpHeaders,OutputStream entityStream) throws IOException,WebApplicationException {try {Class<?> domainClass = getDomainClass(genericType);Marshaller m = getJAXBContext(domainClass, mediaType).createMarshaller();m.setProperty("eclipselink.media-type", mediaType.toString());m.setProperty("eclipselink.json.include-root", false);m.marshal(object, entityStream);} catch(JAXBException jaxbException) {throw new WebApplicationException(jaxbException);}}public long getSize(Object t, Class<?> type, Type genericType,Annotation[] annotations, MediaType mediaType) {return -1;}private JAXBContext getJAXBContext(Class<?> type, MediaType mediaType) throws JAXBException {ContextResolver<JAXBContext> resolver = providers.getContextResolver(JAXBContext.class, mediaType);JAXBContext jaxbContext;if(null == resolver || null == (jaxbContext = resolver.getContext(type))) {return JAXBContext.newInstance(type);} else {return jaxbContext;}}private Class<?> getDomainClass(Type genericType) {if(genericType instanceof Class) {return (Class<?>) genericType;} else if(genericType instanceof ParameterizedType) {return (Class<?>) ((ParameterizedType) genericType).getActualTypeArguments()[0];} else {return null;}}}

服务器设置

如果将GlassFish用作应用程序服务器,则需要使用EclipseLink 2.4安装中的对应软件包替换以下EclipseLink软件包。

  • org.eclipse.persistence.antlr.jar
  • org.eclipse.persistence.asm.jar
  • org.eclipse.persistence.core.jar
  • org.eclipse.persistence.jpa.jar
  • org.eclipse.persistence.jpa-modelgen.jar
  • org.eclipse.persistence.moxy.jar
  • org.eclipse.persistence.oracle.jar

进一步阅读

如果您喜欢这篇文章,那么您可能也会对以下内容感兴趣:

  • RESTful服务
    • MOXy作为您的JAX-RS JSON提供程序–客户端
    • 创建一个RESTful服务
      • 第1部分–数据库
      • 第2部分–将数据库映射到JPA实体
      • 第3部分–将JPA实体映射到XML(使用JAXB)
      • 第4部分– RESTful服务
      • 第五部分–客户
    • JAX-RS服务中的MOXy的XML元数据
  • JSON绑定
    • 使用EclipseLink MOXy进行JSON绑定– Twitter示例
    • 绑定到JSON和XML –地理编码示例
  • 应用服务器集成
    • GlassFish 3.1.2充满了MOXy(EclipseLink JAXB)
    • EclipseLink MOXy是WebLogic Server 12c中的JAXB提供程序

参考: MOXy作为您的JAX-RS JSON提供程序–来自Java XML和JSON绑定博客的JCG合作伙伴 Blaise Doughan的服务器端 。


翻译自: https://www.javacodegeeks.com/2012/04/moxy-as-your-jax-rs-json-provider.html

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

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

相关文章

006_过滤器

过滤器 过滤器&#xff08;Filter&#xff09;把附加逻辑注入到MVC框的请求处理&#xff0c;实现了交叉关注。所谓交叉关注&#xff08;Cross-Cutting Concerns&#xff09;&#xff0c;是指可以用于整个应用程序&#xff0c;而又不适合放置在某个局部位置的功能&#xff0c;否…

Android_项目文件结构目录分析

android项目文件结构目录分析 在此我们新建了一个helloworld的项目&#xff0c;先看一些目录结构&#xff1a; 这么多的文件夹和文件中&#xff0c;我们重点关注是res目录、src目录、AndroidManifest.xml文件&#xff1a; 一、res目录主要是用来存放android项目的各种资源文件&…

实体 联系 模型mysql_数据库系统概念读书笔记――实体-联系模型_MySQL

bitsCN.com数据库系统概念读书笔记——实体-联系模型前言为了重新回顾我写的消息系统架构&#xff0c;我需要重新读一下数据库系统概念的前三章&#xff0c;这里简单的做一个笔记&#xff0c;方便自己回顾基本概念实体-联系(E-R)数据模型基于对现实世界的这样一种认识&#xff…

使用Twitter Bootstrap,WebSocket,Akka和OpenLayers玩(2.0)

原始帖子可以在ekito网站上找到。 对于我们的一位客户&#xff0c;我们需要显示一张具有实时更新的车辆位置的地图。 因此&#xff0c;我开始使用Play制作原型&#xff01; 框架及其最新发布的版本2.0&#xff0c;使用Java API。 我从Play的网络聊天室开始&#xff01; 2.0个样…

同步时间

同步时间 [rootlocalhost 03]# ntpdate 0.centos.pool.ntp.org 转载于:https://www.cnblogs.com/cglWorkBook/p/5556920.html

mysql 5.6.23免安装_mysql5.6.23免安装配置

1.官网下载&#xff0c;并解压2.环境变量&#xff0c;path下&#xff0c;追加mysql的bin路径D:\Program Files\mysql\bin;3.mysql目录下的my-default.ini重命名为my.ini&#xff0c;并添加下面的代码basedirD:/Program Files/mysql #mysql路径datadirD:/Program Files/mysql/d…

在Intellij IDEA中运行Vaadin应用

在本文中&#xff0c;我将向您展示如何使用Intellij IDEA运行vaadin应用程序。 Vaadin提供了一些用于Eclipse和Netbeans的插件。 但是对于Intellij IDEA来说&#xff0c;还没有插件。 但是部署vaadin应用程序比其他两个IDE容易。 这是您要遵循的步骤。 1.首先创建一个新项目&am…

mysql主从数据库

Mysql主从配置&#xff0c;实现读写分离 大型网站为了软解大量的并发访问&#xff0c;除了在网站实现分布式负载均衡&#xff0c;远远不够。到了数据业务层、数据访问层&#xff0c;如果还是传统的数据结构&#xff0c;或者只是单单靠一台服务器扛&#xff0c;如此多的数据库连…

安装openstack时遇到的错误

学习opensatck的第一步是安装DevStack来进行本机操作 1. 下面命令没有权限&#xff0c;解决办法&#xff1a;切换到root用户下执行sudo -s echo "stack ALL(ALL) NOPASSWD: ALL" >> /etc/sudoers2. 执行下面命令提示没有git&#xff0c;解决办法&#xff1a;su…

Java EE 6示例– Galleria –第3部分

关于Galleria示例的先前文章&#xff08; 第1 部分 | 第2部分 | 第3部分 | 第4部分 &#xff09;指导您完成基础知识以及对GlassFish和WebLogic的初始部署。 从今天开始&#xff0c;我尝试在其中添加一些企业级功能&#xff0c;因为我发现他们在自己的项目中提出了很多要求。 我…

在 Windows 上测试 Redis Cluster的集群填坑笔记

redis 集群实现的原理请参考http://www.tuicool.com/articles/VvIZje集群环境至少需要3个节点。推荐使用6个节点配置&#xff0c;即3个主节点&#xff0c;3个从节点。新建6个文件夹 分别是 7000/7001/7002/7003/7004/7005将redis.windows.conf 复制一份然后修改配置文件中的下面…

不成为编程天才的5种贡献方式

安迪莱斯特&#xff08;Andy Lester&#xff09;早在三月发布了原始指南&#xff0c;其中介绍了14种不成为编程天才或摇滚明星的贡献开源的方法 &#xff0c;我真的很喜欢这个想法。 这就是为什么我决定稍微采纳一下这篇文章&#xff0c;并告诉您如何以及可以做什么来支持自己喜…

mysql数据库设计与应用答案智慧树_智慧树_MySQL数据库设计与应用_完整免费答案...

单位工程施工组织设计的技术经济指标体系包括有()。A&#xff0e;工期指标B&#xff0e;劳动指标C&#xff0e;台班利用率D&#xff0e;成本降低大跨径桥梁采用()将会取得良好的技术经济效益。A&#xff0e;横移法施工B&#xff0e;顶推法施工C&#xff0e;转体法施工D&#xf…

拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur

https://www.luogu.org/problem/show?pid3119 本来我是来练习tarjan的&#xff0c;结果tarjan部分直接copy了&#xff0c;反而拓扑排序部分想了好久&#xff1b; 这道题SZB大神两次就AC&#xff1b; 但我等到AC&#xff0c;写好题解就只能洗洗睡了&#xff1b; 唉~ 差距怎…

谈谈父类和子类的隔离性

以前写代码知道要给类外设置访问接口, 例如下例: 1 class Money2 {3 public:4 Money(int money) : m_curValue(money){}5 6 void store(int money) { m_curValue money;}7 void spent(int money){ m_curValue - money;}8 private:9 int m_curValue…

用于数据库测试的DBUnit,Spring和注释

如果您曾经尝试用Java编写数据库测试&#xff0c;则可能会碰到DBUnit 。 DBUnit允许您设置和拆除数据库&#xff0c;以便它包含可针对其编写测试的一致行。 通常&#xff0c;您可以通过编写一个简单的XML文档来指定要DBUnit插入的行&#xff0c;例如&#xff1a; <?xml ve…

阿里云centos 7.6安装mysql_阿里云Centos7上安装MySQL教程

1 基本安装过程1.查看系统是否安装了mysql软件# rpm -qa|grep -i mysql2.将已经安装过的软件卸载掉。注意&#xff1a;这样的卸载是不彻底&#xff0c;不过这里够用了# yum remove 软件名3.CentOS 7的yum源中默认是没有mysql的。所以&#xff0c;为了解决这个问题我们首先下载安…

Struts2中数据封装方式

一、通过ActionContext类获取 public class ActionContextDemo extends ActionSupport { Override public String execute() throws Exception { //获取ActionContext对象 ActionContext context ActionContext.getContext(); //调用getParameters…

第五章、搭建S3C6410开发板的测试环境

通过对本章的学习&#xff0c;我对s3c6410开发板的测试环境有了一定的认识&#xff0c;并掌握了如下的知识点&#xff1a;一、对于s3c6410这款开发板&#xff0c;它是一款低功耗、高性价比的处理器&#xff0c;它是基于ARM11的内核。二、不同开发板的区别主要在烧录嵌入式系统的…