欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

GlassFish 4 中EclipseLink MOXY实现REST应用简介(1)(2)

来源: javaer 分享于  点击 11224 次 点评:204

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <phone-number type="work">555-1234</phone-number>  

 如果不使用@XmlValue注解,则输出的XML为:

  1. <phone-numbertypephone-numbertype="work"> 
  2.   <value>12345</value> 
  3. </phone-number>  

接下来,我们尝试调用这个服务。下面是调用的urlhttp://localhost:8080/CustomerResource/rest/customers/1,则返回的XML为:

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
  2. <customer id="1"> 
  3.     <name>Jane Doe</name> 
  4.     <phoneNumbers> 
  5.         <phoneNumber type="work">5551111</phoneNumber> 
  6.     </phoneNumbers> 
  7. </customer> 

这个并不奇怪,因为对象是以JAXB的标准去注解的,可以通过REST返回XML。如果在GlassFish 3.1.2的时候,Moxy还不是默认的JSON Provider,有如下的几点值得注意:

  •   POJO中的id属性如果是int类型的会以JSON text类型返回
  • customer对象中的phoneNumbers属性,其实持有的是List<PhoneNumber>,但在转变为JSON时变为JSON对象而不是一个JSON数组,如下:
    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 注解,转变成JSON后,会分别变成“@type”,“$”显的不合理。而在最新的GlassFish 4中,上面的问题已经得到明显改善,输出的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的朋友应该清楚,phoneNumbers在这里依然没能转换为最标准的JSON格式,但我们可以使用JAX-RS中的ContextResolver机制,并使用MXOYMOXyJsonConfig类去自定义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<MoxyJsonConfig> { 
  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方法,重新设置了使用原来POJO中的字段名作为JSON的key,因此就不带任何多余的符号了,生成的XML如下:

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

可见,这是符合JSON格式标准的输出了。 读者可以进一步通过http://www.eclipse.org/eclipselink/moxy.php访问更多关于MOXY项目的情况,也可以关注http://blog.bdoughan.com/的博客以了解更多关于MXOY项目的用法。


相关栏目:

用户点评