Rest实践之POST+json总结

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.   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值