博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Rest实践之POST+json总结
阅读量:1970 次
发布时间:2019-04-27

本文共 4279 字,大约阅读时间需要 14 分钟。

1.  目的

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

2. 关键要点

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

3. 关键代码

@POST    @Path("/service/deploy")    @Consumes(MediaType.APPLICATION_JSON)    @Produces(MediaType.APPLICATION_JSON)    public String createService(NgmaServiceConfig  serviceconfig)    {        log.info("create service");        log.info("the service config received is {}",serviceconfig);        /**         {         "serviceName":"provision",         "serviceNode":{"nodeName":"node1"},         "serviceAttributes":{"pname":"aaa"}          }         */        JsonObject json = new JsonObject();        //generate service id randomly        UUID  serviceID=UUID.randomUUID();        //append other attributes for service in demo         serviceconfig.setServiceId(serviceID);        NgmaServiceNode node = new NgmaServiceNode();        node.setNodeId(UUID.fromString("24c0a3f7-5d34-48bc-8472-90f98836033b"));        node.setNodeName("node1");        serviceconfig.setServiceName("provision");        serviceconfig.setServiceNode(node);        NgmaServiceType serviceType = new NgmaServiceType();        serviceType.setServiceTypeId(UUID.fromString("8ef879ef-3837-4d24-b53e-79c191624c52"));        serviceconfig.setServiceType(serviceType);        try        {            servicedata.saveServiceConfig(serviceconfig);        }        catch (PlcmStatusException e)        {            // TODO implement catch PlcmStatusException            log.debug("failed to create service ", e);                    }        json.addProperty("serviceUUID",serviceID.toString());                    return json.toString();               }
重点分析:

@Consumes(MediaType.APPLICATION_JSON)
  指明接受的数据类型是json格式

@Produces(MediaType.APPLICATION_JSON)

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

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

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

{     "serviceName":"provision",     "serviceNode":{"nodeName":"node1"},     "serviceAttributes":{"pname":"aaa"}}
对应 的pojo类如下:

@XmlRootElement(name = "serviceconfig")public class NgmaServiceConfig extends MemEntity implements Serializable{    /**     *      */    private static final long serialVersionUID = -6005926332718108639L;    private UUID serviceId;    private String serviceName;    // private UUID nodeId;    @NgmaRefObjectAnnotation(type = "object", getter = "getServiceNode", setter = "setServiceNode")    private NgmaServiceNode serviceNode;    // private UUID serviceTypeId;    @NgmaRefObjectAnnotation(type = "object", getter = "getServiceType", setter = "setServiceType")    private NgmaServiceType serviceType;    @NgmaRefObjectAnnotation(type = "list", getter = "getServiceDefinedTransport", setter = "setServiceDefinedTransport")    private List
serviceDefinedTransport; private Map
serviceAttributes;
刚开始,一致报错unknownpropertyexception,因为我把json格式带上了根标识,如下,

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

@XmlRootElement(name = "serviceconfig")

4. 问题

1. 

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

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

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

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

private Map
> 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

 

你可能感兴趣的文章
【NLP学习笔记】中文分词(Word Segmentation,WS)
查看>>
对于时间复杂度的通俗理解
查看>>
如何输入多组数据并输出每组数据的和?
查看>>
行阶梯型矩阵
查看>>
MATLAB指定路径保存图片方法
查看>>
JAVA学习笔记6 - 数组
查看>>
JAVA学习笔记10 - 继承
查看>>
【学习笔记】Android Activity
查看>>
诡异的 Scroll view may have only one direct child placed within it 错误
查看>>
location区段
查看>>
nginx访问控制、基于用户认证、https配置
查看>>
linux内存的寻址方式
查看>>
how2heap-double free
查看>>
how2heap-fastbin_dup_consolidate
查看>>
tf keras SimpleRNN源码解析
查看>>
MyBatisPlus简单入门(SpringBoot)
查看>>
攻防世界web进阶区web2详解
查看>>
xss-labs详解(上)1-10
查看>>
xss-labs详解(下)11-20
查看>>
攻防世界web进阶区ics-04详解
查看>>