cxf+spring自定义restful接口返回消息

来源:互联网 发布:ae后期制作软件 编辑:程序博客网 时间:2024/05/20 19:18

cxf+spring自定义restful接口返回消息

因项目需要,需要对外提供webservice接口。之前也没有写过这种接口,不知道用那种框架好。上网搜索了一堆材料,最终决定使用cxf+spring实现restful风格的方式。

接口的返回数据,我准备支持xml和json两种格式,根据请求url的后缀(.json或.xml)返回相应格式的数据。我自己定义了返回数据格式:

{    "errcode": 0,     "errmsg": "success",     "list": [        {            "uuid": "dea53c6ca7d011e6802eb82a72db6d4d",             "name": "分组3啦啦啦啦啦"        }    ]}
对应的xml格式:

<result>
<errcode>0</errcode>
<errmsg>success</errmsg>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="deviceGroupVO">
<name>分组3啦啦啦啦啦</name>
<uuid>dea53c6ca7d011e6802eb82a72db6d4d</uuid>
</list>
</result>
消息对应的java类:
import java.util.List;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;

/**
 * 自定义webservice错误返回信息
 * @author xiechengsuan
 * 创建日期 2016.11.10
 */
@XmlRootElement(name = "result")
@XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD)
public class ResponseInfo<T> {
private int errcode;
private String errmsg;
private List<T> list;


public int getErrcode() {
return errcode;
}
public void setErrcode(int errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
public Object getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}


}
这样定义一直报类似下面这样的错:

com.sun.istack.SAXException2: class com.visionvera.cms.bean.AVO以及其任何超类对此上下文都是未知的。


原因:这个list需要支持多种不同的数据类型(泛型),然而list解析的时候却无法找到具体类型与xml的对应关系。

解决方法:使用@XmlSeeAlso把类改成:

import java.util.List;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;

/**
 * 自定义webservice错误返回信息
 * @author xiechengsuan
 * 创建日期 2016.11.10
 */
@XmlRootElement(name = "result")
@XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD)
@XmlSeeAlso({AVO.class, BVO.class})  
public class ResponseInfo<T> {
private int errcode;
private String errmsg;
private List<T> list;


public int getErrcode() {
return errcode;
}
public void setErrcode(int errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
public Object getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}

这样,解析的时候就能找到对应的xml映射关系了。



原创粉丝点击