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.pswp.cn/news/372887.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372887.shtml
英文地址,請注明出處:http://en.pswp.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的內核。二、不同開發板的區別主要在燒錄嵌入式系統的…