moxy json介绍_MOXy作为您的JAX-RS JSON提供程序–服务器端

moxy 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

moxy json介绍

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

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

相关文章

mysql教程清华课后答案_mysql学习之路_sql

查看数据库&#xff1a;Show databases;查看指定部分数据库&#xff1a;模糊查询Show databases like ‘patten’;--paatten是匹配模式%&#xff1a;表示是匹配模式_&#xff1a;表示匹配单个字符&#xff1b;查看数据库创建语句&#xff1a;Show create database 数据库名[库选…

那么您想做微服务吗? 请观看微服务以防万一

Bert Ertman在本次有关微服务的演示中提供了许多有效的观点。 您是否正在考虑在项目&#xff0c;团队或公司中遵循此路径&#xff1f; 请拿起咖啡&#xff0c;记事本&#xff08;如果您喜欢手写笔记&#xff09;并观看。 看到许多公司和团队确实很痛苦&#xff0c;精力浪费&…

MDX中Filter 与Exist的区别

获得一个集合&#xff0c;这个一般用来筛选出一个自定义的set&#xff0c;比如在中国的餐厅 该set返回所有MSDNteam下并且在Fact Thread度量上有记录的products 用Exists实现 select Exists( [Dim Queue].[Product - Queue].MEMBERS, [Dim Engineer].[Team - Engineer].[Team N…

java chsftp.get 追加_Java SFTP上传使用JSch,但如何覆盖当前文件?

我试图使用JSch将两个文件上传到具有SFTP的服务器.如果目录为空,则上传文件可以正常工作,但我想一遍又一遍地上传相同的文件(只需更改内部的id),但是我无法弄清楚如何做到这一点. JSch中有一些静态参数叫做OVERWRITE,但是我无法找到如何使用它.任何人都关心我如何添加这个设置&…

MySQL在Django框架下的基本操作(MySQL在Linux下配置)

注&#xff1a;本文已迁移至CSDN&#xff0c;后续的更新也会在CSDN。 http://blog.csdn.net/houchaoqun_xmu/article/details/53813633 http://blog.csdn.net/houchaoqun_xmu 【原】本文根据实际操作主要介绍了Django框架下MySQL的一些常用操作&#xff0c;核心内容如下&#x…

Clean Sheet – Windows 10的人体工程学Eclipse主题

Clean Sheet是适用于Windows 10的符合人体工程学的Eclipse主题。它基于干净&#xff0c;低眩光的外观和感觉&#xff0c;旨在减轻视觉疲劳和眼睛疲劳。 它融合了均衡的颜色选择&#xff0c;可以突出谐波语法并注重可读性。 除自定义滚动条外&#xff0c;它还努力满足现代美学要…

php mysql插入的数据有引号_php – 由于’引号’的不同,数据没有插入到mysql数据库中...

您不需要在查询中封装表,除非它们有空格或者它们是保留字.INSERT INTO lms.test2 (trn) VALUES (17)// This makes no real sense to the db. It should be:INSERT INTO lms.test2 (trn) VALUES (17)如果列trn接受数字,它应该是&#xff1a;INSERT INTO lms.test2 (trn) VALUES…

CentOS上安装MyCat-MySQL

1、安装JDK&#xff0c;要求JDK7以上。 2、下载MyCat&#xff0c;地址。 3、解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz&#xff0c;到usr/local/Mycat目录下。 4、添加用户Mycat。 [rootlocalhost Desktop]# useradd Mycat [rootlocalhost Desktop]# passwd M…

Java中的Redis的思维导图_Redis思维导图

常见相关问题Redis 有哪些功能&#xff1f;数据缓存功能分布式锁的功能支持数据持久化支持事务支持消息队列Redis 为什么是单线程的&#xff1f;因为 cpu 不是 Redis 的瓶颈&#xff0c;Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现&#xff0c;而且 cpu 又…

在Java EE应用程序中实现自动重试

最初&#xff0c;我想将此博客称为“ 具有拦截器驱动的重试策略的灵活超时 ”&#xff0c;但后来我认为它太“繁重”。 该声明以及修改后的标题应该&#xff08;希望&#xff09;使您了解此帖子可能谈论的内容;-) 触发 这篇文章主要由我在较早的一篇文章中收到的评论/问题之一…

2016-12-17 新浪博客服务器挂掉了,所有博客页面都无法打开

今天&#xff08;2016-12-17 10:20&#xff09;早晨从百度上检索到一篇新浪博客文章&#xff0c;点进去之后显示无法访问此网址&#xff0c;如下截图 去新浪博客主页看了看&#xff0c;主页是可以打开的 但是点进去任何一篇文章&#xff0c;都无法打开此页面 应该是新浪博客的服…

php版本7历史,php的版本发展历史(1995-2020)

PHP一直作为Web开发中的统治力量而存在&#xff0c;在WEB服务端开发领域&#xff0c;全球份额始终保持在78%以上。PHP快速&#xff0c;非常强大&#xff0c;生态好&#xff0c;而且免费&#xff0c;是一个为WEB而生的编程语言&#xff0c;自从诞生起PHP就被大多数开发者称为世界…

一周学会HTML----Day03常用标签(下)

form 标签 表单&#xff08;重要&#xff09; 表单用途 用于收集用户信息&#xff0c;提交给服务器 基本使用 (action,method,enctype) 要提交的表单必须放到form里 input select textarea 这三种标签可以提交数据 action&#xff1a;提交地址&#xff0c;应该是服务器的一个页…

java表达式1 29的计算结果是,java表达式陷阱 - Funcy1122的个人空间 - OSCHINA - 中文开源技术交流社区...

1.赋值运算1.1 表达式直接赋值int a 1;a 2;System.out.println(a);1.2 同一表达式多个赋值int a 10;int b a(a5)a(a10);System.out.println(b);System.out.println(a);运算过程如下&#xff1a;int b a(a5)a(a10);(1)10(a5)a(a10)a 5(2)105a(a10)a 5(3)1055(a10)a 10(4…

netbeans7.4_NetBeans 7.2 beta:更快,更有用

netbeans7.4NetBeans 7.2的beta版本引起了极大的兴奋。 在本文中&#xff0c;我将简要介绍一下此版本令人兴奋的原因&#xff08;包括更好的性能&#xff0c;提供更多的提示以及集成FindBugs&#xff09;。 NetBeans 7.2 beta在典型的下载捆绑软件中可用&#xff0c;从较小的Ja…

C-Free 5.0编译失败问题解决办法

解决关于C-Free 5.0编译时提示错误&#xff1a;[Error] undefined reference to __dyn_tls_init_callback 解决办法&#xff1a; 因为错误提示的路径是C:\MinGW\..... 首先想到的是编译器出问题了&#xff0c;因为我在安装完C-Free 5.0后&#xff0c;重新装过MinGW编译器&#…

php强类型作用,php类、接口、抽象、trait、强类型使用

declare(strict_types 1);//declare(strict_types1);//php7严格模式,只规定当前文件使用严格模式//function test(string/int/Obj/array):void/int/?int//返回值和参数可指定类型/*function test(string $a,int $b,Obj $obj,array $arr,boolean $boo):?int{if($boo true){r…

用Cucumber JVM编写BDD测试

Cucumber JVM是编写BDD测试的出色工具。在本文中&#xff0c;我想对Cucumber JVM的BDD进行介绍。 让我们开始吧… 什么是BDD&#xff1f; 简而言之&#xff0c;BDD试图解决“通过示例理解需求”的问题 BDD工具 有许多用于BDD的工具&#xff0c;有趣的是&#xff0c;您可以在…

Bootstrap之栅格系统

bootstrap 移动优先  中文官网 http://www.bootcss.com/ 1.基本模板 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 兼容IE --><meta http-equiv"X-UA-Compatible" content"IEedg…

计算器界面网格布局java,安卓案例:网格布局实现计算器界面

安卓案例&#xff1a;网格布局实现计算器界面一、网格布局(GridLayout)GridLayout布局使用虚细线将布局划分为行、列和单元格&#xff0c;也支持一个控件在行、列上都有交错排列。(一)继承关系图(二)常用属性1、针对布局的属性(1)rowCount&#xff1a;行数(2)columnCount&#…