读书人

CXF restful webserice与此同时支持几

发布时间: 2012-07-15 20:20:05 作者: rapoo

CXF restful webserice同时支持几种协议 json, xml... 很简单
1. 假设我们有个服务 (都是从别处拿来的代码)

mport javax.ws.rs.*;import javax.ws.rs.core.Response;@Path(value = "/student/{id}")public interface StudentService{    @GET    @Path(value = "/info")    Student getStudent(@PathParam("id") long id, @QueryParam("name")    String name);    @GET    @Path(value = "/info2")    UserResponse getStudent(@QueryParam("name") String name);}


服务实现类:

import javax.ws.rs.core.Response;import java.text.ParseException;import java.text.SimpleDateFormat;public class StudentServiceImpl implements StudentService{    public Student getStudent(long id, String name)    {        Student s = new Student();        s.setId(id);        s.setName(name);        try        {            s.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1983-04-26"));        }        catch (ParseException e)        {            e.printStackTrace();        }        return s;    }    public Response getStudent1(String name)    {        Student s = new Student();        s.setId(1);        s.setName(name);        try        {            s.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1983-04-26"));        }        catch (ParseException e)        {            e.printStackTrace();        }        return Response.ok(s).build();        //return s;    }    public UserResponse getStudent(String name)    {        Student s = new Student();        s.setId(1);        s.setName(name);        try        {            s.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1983-04-26"));        }        catch (ParseException e)        {            e.printStackTrace();        }        return new UserResponse("ok", s);    }


返回数据包装类

import javax.xml.bind.annotation.*;@XmlRootElement(name = "Response")@XmlAccessorType(XmlAccessType.FIELD)public class UserResponse{    private String status;    private Student data;    public UserResponse()    {    }    public UserResponse(String status, Student data)    {        this.status = status;        this.data = data;    }    public String getStatus()    {        return status;    }    public void setStatus(String status)    {        this.status = status;    }    public Object getData()    {        return data;    }    public void setData(Student data)    {        this.data = data;    }}


普通类


import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlRootElement;import java.util.Date;@XmlRootElement(name = "Student")@XmlAccessorType(XmlAccessType.FIELD)public class Student{    private long id;    private String name;    private Date birthday;    public long getId()    {        return id;    }    public void setId(long id)    {        this.id = id;    }    public String getName()    {        return name;    }    public void setName(String name)    {        this.name = name;    }    public Date getBirthday()    {        return birthday;    }    public void setBirthday(Date birthday)    {        this.birthday = birthday;    }}



Spring 服务声明


<import resource="classpath:META-INF/cxf/cxf.xml"/>    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>    <import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/>    <bean id="rsStudentServiceImpl" />    <jaxrs:server id="test" address="/student" >        <jaxrs:serviceBeans>            <ref bean="rsStudentServiceImpl" />        </jaxrs:serviceBeans>                   <!-- 这里设置了对应关系, 按理说默认就应该是这样, 你可以试试. 当然可以自定义  -->        <jaxrs:extensionMappings>          <entry key="json" value="application/json"/>          <entry key="xml" value="application/xml"/>        </jaxrs:extensionMappings>    </jaxrs:server>


web.xml 就不贴了, 和普通的一样.



2. 访问方法有3种, 可以实现获取不同格式的内容.

http://localhost:8080/student/student/3/info2.json?name=abcss
http://localhost:8080/student/student/3/info2.xml?name=abcss

http://localhost:8080/student/student/3/info2?name=abcss&_type=xml
http://localhost:8080/student/student/3/info2?name=abcss&_type=json

还有一种办法就是在请求时设置Accept:

 HttpGet get = new HttpGet(                "http://127.0.0.1:8080/student/student/3/info2?name=Fetion");        HttpClient httpclient = new DefaultHttpClient();        get.addHeader("ACCEPT", "application/xml");        HttpResponse response = httpclient.execute(get);        StatusLine st = response.getStatusLine();    InputStream ins = response.getEntity().getContent();    byte[] b = new byte[1024];    StringBuilder sb = new StringBuilder();    while (ins.read(b) != -1)    {        sb.append(new String(b, "UTF-8"));    }    System.out.println(sb.toString());


简单吧.... 呵呵 1 楼 zjc198805 2012-05-23 LZ,为什么刷新按住N次以后请求就获取不到数据了? 2 楼 zjc198805 2012-05-23 联系方式:644952013 3 楼 bjyzxxds 2012-05-23 你firebug看看刷新N次以后,获取不到参数时,页面提交的参数什么呢,然后分析原因,应该不会是webservice的问题 4 楼 sophie_laputa 2012-05-30 请问用的是哪一个版本的cxf呢

读书人网 >Web前端

热点推荐