java开发中使用CXF发布rest风格的webservice服务
1.什么是cxf
Cxf,apache下的webservice的开源框架。
Apache CXF = Celtix + Xfire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。Apache CXF 是一个开源的 web Services 框架,CXF 帮助您构建和开发 web Services ,它支持多种协议,比如:SOAP1.1,1,2、XML/HTTP、RESTful HTTP 或者 CORBA。
CORBA(Common Object Request BrokerArchitecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#)
Cxf是基于SOA总线结构,依靠spring完成模块的集成,实现SOA方式。
灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置),weblogic上面。
2.使用cxf发布webservice步骤
l 使用jaxwsServerFactoryBean发布 webservice服务端。
需要设置:
jaxwsServerFactoryBean.setAddress(“webservice地址”)
jaxwsServerFactoryBean.setServiceClass(“porttype类路径”);//由程序员编写的
jaxwsServerFactoryBean.setServiceBean(“porttype类对象”);
jaxwsServerFactoryBean.create();//发布一个服务
l 使用jaxwsProxyFactoryBean实现客户端调用webservice服务
jaxwsServerFactoryBean.setAddress(“webservice的wsdl地址”)
jaxwsServerFactoryBean.setServiceClass(“porttype类路径”);//portType是由wsdl2java工具生成
jaxwsServerFactoryBean.setCreate();//创建porttype对象
3. CXF发布rest风格的webservice
3.1 什么是rest
使用rest方式表达url更加简单、可以准确表达这个url是一个学生信息查询url
不使用rest的url:http://ip:port/queryUser.action?userType=XXX&studentid=001&XXXX
使用 rest的url:http://ip:port/user/student/001
3.2 创建pojo
package com.zl.ws.cxf.rest.pojo;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.Date;
/**
* * @author: zenglong
* * @ClassName: com.zl.ws.cxf.rest.pojo
* * @Description:
* * @date: 2018/1/15
*
*/
@XmlRootElement
public class Student {
private long id;
private String name;
private Date date;
public long getId() {
return id;
}
public String getName() {
return name;
}
public Date getDate() {
return date;
}
public void setId(long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setDate(Date date) {
this.date = date;
}
}
3.3 webservice接口
package com.zl.ws.cxf.rest.service;
import com.zl.ws.cxf.rest.pojo.Student;
import javax.jws.WebService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.List;
/**
* * @author: zenglong
* * @ClassName: com.zl.ws.cxf.rest.service
* * @Description:
* * @date: 2018/1/15
*
*/
@WebService
@Path("/student")
public interface StudentService {
//查询学生信息
@GET
@Path("/query/{id}")
@Produces(MediaType.APPLICATION_XML)
public Student queryStudent(@PathParam("id") long id);
@GET
@Path("/querylist/{type}")
//@Produces(MediaType.APPLICATION_XML)
@Produces({"application/json;charset=utf-8",MediaType.APPLICATION_XML})//设置媒体类型xml格式和json格式
//如果想让rest返回xml需要在rest的url后边添加?_type=xml,默认为xml
//如果想让rest返回json需要在rest的url后边添加?_type=json
public List<Student> queryStudentList(@PathParam("type") String type);
}
3.4 接口实现类
package com.zl.ws.cxf.rest.service;
import com.zl.ws.cxf.rest.pojo.Student;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* * @author: zenglong
* * @ClassName: com.zl.ws.cxf.rest.service
* * @Description:
* * @date: 2018/1/15
*
*/
public class StudentServiceImpl implements StudentService {
@Override
public Student queryStudent(long id) {
// 使用静态数据
Student student = new Student();
student.setId(id);
student.setName("张三");
student.setDate(new Date());
return student;
}
@Override
public List<Student> queryStudentList(String type) {
// 使用静态数据
List<Student> list = new ArrayList<Student>();
Student student1 = new Student();
student1.setId(1000l);
student1.setName("张三");
student1.setDate(new Date());
Student student2 = new Student();
student2.setId(1000l);
student2.setName("张三");
student2.setDate(new Date());
list.add(student1);
list.add(student2);
return list;
}
}
3.5 服务器:
package com.zl.ws.cxf.rest.service;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
/**
* * @author: zenglong
* * @ClassName: com.zl.ws.cxf.rest.service
* * @Description:服务器
* * @date: 2018/1/15
*
*/
public class StudentServer {
public static void main(String[] args) {
//使用jaxrsServerFactoryBean发布rest服务
JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean();
//设置rest的服务地址
jaxrsServerFactoryBean.setAddress("http://127.0.0.1:12345/rest");
//设置服务对象
jaxrsServerFactoryBean.setServiceBean(new StudentServiceImpl());
//设置资源 对象,如果有多个pojo资源 对象中间以半角逗号隔开
jaxrsServerFactoryBean.setResourceClasses(StudentServiceImpl.class);
//发布rest服务
jaxrsServerFactoryBean.create();
}
}
4.启动后,输入地址查看效果如下:
http://127.0.0.1:12345/rest/student/query/001 查询学生信息
http://127.0.0.1:12345/rest/student/querylist/001?_type=xml 查询学生信息列表,返回xml
http://127.0.0.1:12345/rest/student/querylist/001?_type=json 查询学生信息列表,返回json