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映射关系了。

猜你喜欢

转载自blog.csdn.net/u012799221/article/details/53158084