日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
GlassFish4中EclipseLinkMOXY實(shí)現(xiàn)REST應(yīng)用簡介

最近,隨著JAVA EE 7 標(biāo)準(zhǔn)的最終落地,其中Oracle 還發(fā)布了GlassFish 4服務(wù)器,它可以說是JAVA EE 7標(biāo)準(zhǔn)的一種參考實(shí)現(xiàn)。 其中,Eclipse旗下的EclipseLink開源項目向JAVE EE 7中貢獻(xiàn)了不少力量,其中包括JPA 2.1 (JSR-338)的實(shí)現(xiàn),另外一個貢獻(xiàn)是本文向大家介紹的EclipseLink MOXy項目,它是JAVE EE 7中JAX-RS(REST標(biāo)準(zhǔn))的一個默認(rèn)的JSON Provider。

首先簡單介紹下Eclipse旗下的EclipseLink開源項目,它主要用來實(shí)現(xiàn)快速將JAVA中的對象轉(zhuǎn)化為各種類型的XML,該項目主要有如下的特性:

  • 支持JAXB中最多的注解
  • 同時支持XML和JSON
  • 支持最新的JPA 2.1

對JPA-RS的增強(qiáng)支持

 MOXY有十分強(qiáng)大的將各類JAVA對象 序列化為XML以及XML反序列化為JAVA對象的能力。這在REST架構(gòu)的應(yīng)用中,MOXY可以用來實(shí)現(xiàn)JAX-RS標(biāo)準(zhǔn)中的各種轉(zhuǎn)換,下面以一個REST的例子進(jìn)行講解。如果讀者對REST和JAX-RS標(biāo)準(zhǔn)有不清楚的地方,請參考相關(guān)的資料。

  我們設(shè)計一個最簡單的Hello World的REST Webservice。其中Customer對象是一個簡單的POJO對象,代碼如下:

 
 
 
  1. package org.example.service; 
  2.  
  3. import javax.ejb.*; 
  4. import javax.ws.rs.*; 
  5. import javax.ws.rs.core.MediaType; 
  6. import org.example.model.*; 
  7.  
  8. @Stateless 
  9. @LocalBean 
  10. @Path("/customers") 
  11. public class CustomerService { 
  12.  
  13.     @GET 
  14.     @Produces({ 
  15.         MediaType.APPLICATION_XML, 
  16.         MediaType.APPLICATION_JSON 
  17.     }) 
  18.     @Path("{id}") 
  19.     public Customer read(@PathParam("id") int id) { 
  20.         Customer customer = new Customer(); 
  21.         customer.setId(id); 
  22.         customer.setName("Jane Doe"); 
  23.  
  24.         PhoneNumber pn = new PhoneNumber(); 
  25.         pn.setType("work"); 
  26.         pn.setValue("5551111"); 
  27.         customer.getPhoneNumbers().add(pn); 
  28.  
  29.         return customer; 
  30.      } 
  31.  

可以看到,Customer對象中有一個PhoneNumber的表示電話號碼的Pojo。代碼中的注解都是遵守JAX-RS標(biāo)準(zhǔn)的REST相關(guān)的注解。其中,用注解

@ MediaType.APPLICATION_XML和@ MediaType.APPLICATION_JSON,分別指出該REST會同時以XML和JSON的形式對外發(fā)布。而在JAX-RS標(biāo)準(zhǔn)中,用如下的方式,就可以實(shí)現(xiàn)REST的對外發(fā)布部署:

 
 
 
  1.  package org.example.service; 
  2.  
  3. import javax.ws.rs.ApplicationPath; 
  4. import javax.ws.rs.core.Application; 
  5.  
  6. @ApplicationPath("rest/*") 
  7. public class CustomerApplication  extends Application { 
  8.  

其中,@ApplicationPath 注解指定所有服務(wù)的相對基址,如果為空字符串,則直接使用上下文根路徑。上面表示這個REST服務(wù)將以如http://localhost/rest/xxx的形式對外發(fā)布,應(yīng)該的根為rest。
  接下來我們具體看Customer這個POJO,代碼如下:

 
 
 
  1. package org.example.model; 
  2.  
  3. import java.util.*; 
  4. import javax.xml.bind.annotation.*; 
  5.  
  6. @XmlRootElement 
  7. public class Customer { 
  8.  
  9.     private int id; 
  10.     private String name; 
  11.     private List phoneNumbers = new ArrayList(); 
  12.  
  13.     public int getId() { 
  14.         return id; 
  15.     } 
  16.  
  17.     public void setId(int id) { 
  18.         this.id = id; 
  19.     } 
  20.  
  21.     public String getName() { 
  22.         return name; 
  23.     } 
  24.  
  25.     public void setName(String name) { 
  26.         this.name = name; 
  27.     } 
  28.  
  29.     @XmlElementWrapper 
  30.     @XmlElement(name="phoneNumber") 
  31.     public List getPhoneNumbers() { 
  32.         return phoneNumbers; 
  33.     } 
  34.  

在這個Customer對象中,其中保持了對另外一個對象phoneNumber的引用。使用@XmlElementWrapper,其目的是為了在XML中通過單獨(dú)設(shè)置名為phoneNumber的別名標(biāo)簽去
更清晰的輸出。
  接下來請看PhoneNumber類,代碼如下:

 
 
 
  1. package org.example.model; 
  2.  
  3. import javax.xml.bind.annotation.*; 
  4.  
  5. public class PhoneNumber { 
  6.  
  7.     private String type; 
  8.     private String value; 
  9.  
  10.     @XmlAttribute 
  11.     public String getType() { 
  12.         return type; 
  13.     } 
  14.  
  15.     public void setType(String type) { 
  16.         this.type = type; 
  17.     } 
  18.  
  19.     @XmlValue 
  20.     public String getValue() { 
  21.         return value; 
  22.     } 
  23.  
  24.     public void setValue(String value) { 
  25.         this.value = value; 
  26.     } 
  27.  

注意,其中使用了注解@XmlAttribute,將type設(shè)置為轉(zhuǎn)換后XML中的一個屬性,而@XmlValue則將字段value直接序列為值,即如下的樣子:

#p#

 
 
 
  1.  
  2. 555-1234  

 如果不使用@XmlValue注解,則輸出的XML為:

 
 
 
  1.  
  2.   12345 
  3.   

接下來,我們嘗試調(diào)用這個服務(wù)。下面是調(diào)用的url http://localhost:8080/CustomerResource/rest/customers/1,則返回的XML為:

 
 
 
  1.  
  2.  
  3.     Jane Doe 
  4.      
  5.         5551111 
  6.      
  7.  

這個并不奇怪,因為對象是以JAXB的標(biāo)準(zhǔn)去注解的,可以通過REST返回XML。如果在GlassFish 3.1.2的時候,Moxy還不是默認(rèn)的JSON Provider,有如下的幾點(diǎn)值得注意:

  •   POJO中的id屬性如果是int類型的會以JSON text類型返回
  • customer對象中的phoneNumbers屬性,其實(shí)持有的是List,但在轉(zhuǎn)變?yōu)镴SON時變?yōu)镴SON對象而不是一個JSON數(shù)組,如下:
  •   
      
      
    1.  
    2.     "id": "1", 
    3.  
    4.     "name": "Jane Doe", 
    5.  
    6.     "phoneNumbers": { 
    7.  
    8.         "phoneNumber": { 
    9.  
    10.             "@type": "work", 
    11.           "$": "5551111"  
    12.         } 
    13.     }  

更奇怪的是,由于使用了@XmlAttribute注解和@XmlValue 注解,轉(zhuǎn)變成JSON后,會分別變成“@type”,“$”顯的不合理。而在最新的GlassFish 4中,上面的問題已經(jīng)得到明顯改善,輸出的JSON如下:

 
 
 
  1.     "id": 1, 
  2.  
  3.     "name": "Jane Doe", 
  4.  
  5.     "phoneNumbers": { 
  6.  
  7.         "phoneNumber": [ 
  8.  
  9.             "@type": "work", 
  10.  
  11.             "$": "5551111" 
  12.         ] 
  13.     } 

在GlassFish 4中,能夠正確將POJO中的如int類型的正確序列化為JSON中的整形,即“id”:1,注意到PhoneNumber類中的value屬性由于是String類型,因此在序列化為JSON后依然為String類型。但熟悉JSON的朋友應(yīng)該清楚,phoneNumbers在這里依然沒能轉(zhuǎn)換為最標(biāo)準(zhǔn)的JSON格式,但我們可以使用JAX-RS中的ContextResolver機(jī)制,并使用MXOY中MOXyJsonConfig類去自定義JSON格式的顯示,代碼如下:

 
 
 
  1. package org.example.service; 
  2.  
  3. import javax.ws.rs.ext.*; 
  4. import org.eclipse.persistence.jaxb.JAXBContextProperties; 
  5. import org.glassfish.jersey.moxy.json.MoxyJsonConfig; 
  6.  
  7. @Provider 
  8. public class MOXyJsonContextResolver implements ContextResolver { 
  9.  
  10.     private final MoxyJsonConfig config; 
  11.  
  12.     public MOXyJsonContextResolver() { 
  13.         config = new MoxyJsonConfig() 
  14.             .setAttributePrefix("") 
  15.             .setValueWrapper("value") 
  16.             .property(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, true); 
  17.     } 
  18.  
  19.     @Override 
  20.     public MoxyJsonConfig getContext(Class objectType) { 
  21.         return config; 
  22.     } 
  23.  

其中,通過MoxyJsonConfig類中的setValueWrapper方法,重新設(shè)置了使用原來POJO中的字段名作為JSON的key,因此就不帶任何多余的符號了,生成的XML如下:

 
 
 
  1.     "id": 1, 
  2.     "name": "Jane Doe", 
  3.     "phoneNumbers": [ 
  4.         { 
  5.             "type": "work", 
  6.             "value": "5551111" 
  7.         } 
  8.     ] 

可見,這是符合JSON格式標(biāo)準(zhǔn)的輸出了。 讀者可以進(jìn)一步通過http://www.eclipse.org/eclipselink/moxy.php訪問更多關(guān)于MOXY項目的情況,也可以關(guān)注http://blog.bdoughan.com/的博客以了解更多關(guān)于MXOY項目的用法。

 原文鏈接:http://www.javacodegeeks.com/2013/06/moxy-is-the-new-default-json-binding-provider-in-glassfish-4.html


分享名稱:GlassFish4中EclipseLinkMOXY實(shí)現(xiàn)REST應(yīng)用簡介
文章轉(zhuǎn)載:http://www.5511xx.com/article/dhiedcg.html