Rest实践之POST+json总结

来源:互联网 发布:苹果平板淘宝开店在哪 编辑:程序博客网 时间:2024/06/04 20:04

http://blog.csdn.net/hanruikai/article/details/43051849

1.  目的

开发rest 请求创建service, 利用post 请求,并且携带message body,JSON格式,包括service的配置信息,从而实现service添加

2. 关键要点

利用 post请求传输json数据并返还json格式结果

3. 关键代码

[java] view plain copy
 print?
  1. @POST  
  2.   @Path("/service/deploy")  
  3.   @Consumes(MediaType.APPLICATION_JSON)  
  4.   @Produces(MediaType.APPLICATION_JSON)  
  5.   public String createService(NgmaServiceConfig  serviceconfig)  
  6.   {  
  7.       log.info("create service");  
  8.       log.info("the service config received is {}",serviceconfig);  
  9.       /** 
  10.        { 
  11.        "serviceName":"provision", 
  12.        "serviceNode":{"nodeName":"node1"}, 
  13.        "serviceAttributes":{"pname":"aaa"} 
  14.         } 
  15.        */  
  16.       JsonObject json = new JsonObject();  
  17.       //generate service id randomly  
  18.       UUID  serviceID=UUID.randomUUID();  
  19.       //append other attributes for service in demo   
  20.       serviceconfig.setServiceId(serviceID);  
  21.       NgmaServiceNode node = new NgmaServiceNode();  
  22.       node.setNodeId(UUID.fromString("24c0a3f7-5d34-48bc-8472-90f98836033b"));  
  23.       node.setNodeName("node1");  
  24.       serviceconfig.setServiceName("provision");  
  25.       serviceconfig.setServiceNode(node);  
  26.       NgmaServiceType serviceType = new NgmaServiceType();  
  27.       serviceType.setServiceTypeId(UUID.fromString("8ef879ef-3837-4d24-b53e-79c191624c52"));  
  28.       serviceconfig.setServiceType(serviceType);  
  29.       try  
  30.       {  
  31.           servicedata.saveServiceConfig(serviceconfig);  
  32.       }  
  33.       catch (PlcmStatusException e)  
  34.       {  
  35.           // TODO implement catch PlcmStatusException  
  36.           log.debug("failed to create service ", e);  
  37.             
  38.       }  
  39.       json.addProperty("serviceUUID",serviceID.toString());  
  40.             
  41.       return json.toString();  
  42.       
  43.      
  44.   }  
  45.     
  46.     
重点分析:

[java] view plain copy
 print?
  1. @Consumes(MediaType.APPLICATION_JSON)  
  指明接受的数据类型是json格式

[java] view plain copy
 print?
  1. @Produces(MediaType.APPLICATION_JSON)  

  指定返回的数据类型是json格式

[java] view plain copy
 print?
  1. NgmaServiceConfig    
post请求的json格式service信息会转为NgmaServiceConfig,主要是配置jackson,CXF与Jackson结合,jason把json序列化,反序列化映射到POJO类的属性上。详细资料可以研究jackson,其他开源实现jettison也可以实现。

此处POJO的属性必须与json的配置属性一致,包括大小写,如下所示:

[html] view plain copy
 print?
  1. {  
  2.      "serviceName":"provision",  
  3.      "serviceNode":{"nodeName":"node1"},  
  4.      "serviceAttributes":{"pname":"aaa"}  
  5.   
  6. }  

对应 的pojo类如下:

[java] view plain copy
 print?
  1. @XmlRootElement(name = "serviceconfig")  
  2. public class NgmaServiceConfig extends MemEntity implements Serializable  
  3. {  
  4.     /** 
  5.      *  
  6.      */  
  7.     private static final long serialVersionUID = -6005926332718108639L;  
  8.   
  9.     private UUID serviceId;  
  10.     private String serviceName;  
  11.     // private UUID nodeId;  
  12.   
  13.     @NgmaRefObjectAnnotation(type = "object", getter = "getServiceNode", setter = "setServiceNode")  
  14.     private NgmaServiceNode serviceNode;  
  15.   
  16.     // private UUID serviceTypeId;  
  17.   
  18.     @NgmaRefObjectAnnotation(type = "object", getter = "getServiceType", setter = "setServiceType")  
  19.     private NgmaServiceType serviceType;  
  20.   
  21.     @NgmaRefObjectAnnotation(type = "list", getter = "getServiceDefinedTransport", setter = "setServiceDefinedTransport")  
  22.     private List<NgmaTransport> serviceDefinedTransport;  
  23.     private Map<String, String> serviceAttributes;  

刚开始,一致报错unknownpropertyexception,因为我把json格式带上了根标识,如下,

[html] view plain copy
 print?
  1. {  
[html] view plain copy
 print?
  1. serviceconfig:{  
  2.    "serviceName":"provision",  
  3.    "serviceNode":{"nodeName":"node1"},  
  4.    "serviceAttributes":{"pname":"aaa"}  
  5.   
  6.   }  
[html] view plain copy
 print?
  1. }  
因为pojo类中配置了xmlroot,所以我想json也是,我demo的例子也的确是这样,但是不太清楚为什么现在的工程不能识别?害的我搞了很久。

[java] view plain copy
 print?
  1. @XmlRootElement(name = "serviceconfig")  

4. 问题


1. 

org.apache.cxf.jaxrs.client.ClientWebApplicationException:No message body writer found forclass


配置引入jackson-jxr.jar并在spring配置文件中配置,如下:

[html] view plain copy
 print?
  1.   <jaxrs:server id="ngmaServiceStatus" address="/ngma">  
  2.     <jaxrs:serviceBeans>  
  3.       <ref bean="ngmaServiceStatusBean" />  
  4.     </jaxrs:serviceBeans>  
  5. <strong>   <span style="color:#ff6666;"><jaxrs:providers>  
  6.    <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>  
  7.    </jaxrs:providers></span></strong>  
  8.   
  9.   </jaxrs:server>  

2. Json格式增加xml root,一直保存 ,unknown property exception


3.  jackson支持hashmap  list等集合的属性映射。


  private Map<String, List<MyHolder>> propertyName;
class MyHolder {    @JsonProperty("1")    private String name;    @JsonProperty("2")    private String age;    @JsonProperty("3")    private boolean female;    //getters,setters,toString}

对于的json格式如下:

{   "propertyName":{      "1":[         {            "1":"value1",            "2":"value2",            "3":false         }      ]   }}
5. 参考link

http://www.javatips.NET/blog/2012/02/cxf-restful-tutorial

http://blog.csdn.net/unei66/article/details/12324353

http://wiki.fasterxml.com/JacksonDownload

http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-Formpayloads

http://stackoverflow.com/questions/6312030/cxf-no-message-body-writer-found-for-class-automatically-mapping-non-simple-r


[java] view plain copy
 print?
  1.