天天看点

CXF学习笔记三(发布restFul)

一、概述

JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API。JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开发REST应用,避免了依赖第三方框架。同时JAX-RS使用POJO编程模型和基于注解的配置并集成JAXB,可以有效缩短REST应用的开发周期。JAX-RS只定义RESTful API,具体实现由第三方提供,如Jersey、Apache CXF等。

JAX-RS包含近五十多个接口、注解和抽象类:

javax.ws.rs包含用于创建RESTful服务资源的高层次(High-level)接口和注解。

javax.ws.rs.core包含用于创建RESTful服务资源的低层次(Low-level)接口和注解。

javax.ws.rs.ext包含用于扩展JAX-RS API支持类型的APIs。

JAX-RS常用注解:

@Path:标注资源类或方法的相对路径。

@GET、@PUT、@POST、@DELETE:标注方法的HTTP请求类型。

@Produces:标注返回的MIME媒体类型。

@Consumes:标注可接受请求的MIME媒体类型。

@PathParam、@QueryParam、@HeaderParam、@CookieParam、@MatrixParam、@FormParam:标注方法的参数来自于HTTP请求的位置。@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。

二、依赖JAR文件Maven坐标

Java代码 

CXF学习笔记三(发布restFul)
  1. <properties>  
  2.         <cxf.version>3.0.7</cxf.version>  
  3.         <junit.version>4.11</junit.version>  
  4.     </properties>  
  5. <!-- CXF需要导入的jar包 -->  
  6.         <dependency>  
  7.             <groupId>org.apache.cxf</groupId>  
  8.             <artifactId>cxf-rt-frontend-jaxws</artifactId>  
  9.             <version>${cxf.version}</version>  
  10.         </dependency>  
  11.         <dependency>  
  12.             <groupId>org.apache.cxf</groupId>  
  13.             <artifactId>cxf-rt-transports-http</artifactId>  
  14.             <version>${cxf.version}</version>  
  15.         </dependency>  
  16.         <!-- CXF实现RestFul接口需要用到的包 -->  
  17.         <dependency>  
  18.             <groupId>org.apache.cxf</groupId>  
  19.             <artifactId>cxf-rt-frontend-jaxrs</artifactId>  
  20.             <version>${cxf.version}</version>  
  21.         </dependency>  
  22.         <!-- 客户端调用restFul服务需要导入的包 -->  
  23.         <dependency>  
  24.             <groupId>org.apache.cxf</groupId>  
  25.             <artifactId>cxf-rt-rs-client</artifactId>  
  26.             <version>${cxf.version}</version>  
  27.         </dependency>  
  28.         <!-- 部署至tomcat低下不会,jetty环境需要加入该包 -->  
  29.         <dependency>  
  30.             <groupId>org.apache.cxf</groupId>  
  31.             <artifactId>cxf-rt-transports-http-jetty</artifactId>  
  32.             <version>${cxf.version}</version>  
  33.         </dependency>  

三、发布RestFul接口

3.1实体对象

Java代码 

CXF学习笔记三(发布restFul)
  1. @XmlRootElement(name="UserInfo")  
  2. public class Users{  
  3.     private String userId;  
  4.     private String userName;  
  5.     private String userPwd;  
  6.     private Integer sex;  
  7.     private Float sal;  
  8.     private Date birthday;  
  9.         get、set方法省略!  
  10.     public String toJson() {  
  11.         Gson gson = new Gson();  
  12.         return gson.toJson(this);  
  13.     }  
  14. }  

3.2、定义发布接口

Java代码 

CXF学习笔记三(发布restFul)
  1. import javax.ws.rs.DELETE;  
  2. import javax.ws.rs.GET;  
  3. import javax.ws.rs.POST;  
  4. import javax.ws.rs.PUT;  
  5. import javax.ws.rs.Path;  
  6. import javax.ws.rs.PathParam;  
  7. import javax.ws.rs.Produces;  
  8. import javax.ws.rs.QueryParam;  
  9. import javax.ws.rs.core.MediaType;  
  10. @Path("/restFul")  
  11. public interface UserService {  
  12.     @GET  
  13.     @Path("/get")  
  14.     @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})  
  15.     public Users get(@QueryParam("id") String id);  
  16.     @PUT  
  17.     @Path("/put/{id}")  
  18.     @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})  
  19.     public Users put(@PathParam("id")String id,Users u);  
  20.     @POST  
  21.     @Path("/post/{id}")  
  22.     @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})  
  23.     public Users post(@PathParam("id") String id,Users u);  
  24.     @DELETE  
  25.     @Path("/delete/{id}")  
  26.     @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})  
  27.     public Users delete(@PathParam("id") String id);  
  28. }  

3.3、接口实现类

Java代码 

CXF学习笔记三(发布restFul)
  1. import java.util.Date;  
  2. import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;  
  3. import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;  
  4. public class UserServiceRestFul implements UserService {  
  5.     @Override  
  6.     public Users get(String id) {  
  7.         System.out.println("GET方法,id=" + id);  
  8.         Users user = new Users();  
  9.         user.setUserId("get");  
  10.         user.setUserName("ickes");  
  11.         user.setUserPwd("ices123");  
  12.         user.setSex(1);  
  13.         user.setSal(32F);  
  14.         user.setBirthday(new Date());  
  15.         return user;  
  16.     }  
  17.     @Override  
  18.     public Users put(String id, Users u) {  
  19.         System.out.println("PUT方法,id=" + id + ",users=" + u.toJson());  
  20.         Users user = new Users();  
  21.         user.setUserId("put");  
  22.         user.setUserName("ickes");  
  23.         user.setUserPwd("ices123");  
  24.         user.setSex(1);  
  25.         user.setSal(32F);  
  26.         user.setBirthday(new Date());  
  27.         return user;  
  28.     }  
  29.     @Override  
  30.     public Users post(String id, Users u) {  
  31.         System.out.println("POST方法,id=" + id + ",users=" + u.toJson());  
  32.         Users user = new Users();  
  33.         user.setUserId("post");  
  34.         user.setUserName("ickes");  
  35.         user.setUserPwd("ices123");  
  36.         user.setSex(1);  
  37.         user.setSal(32F);  
  38.         user.setBirthday(new Date());  
  39.         return user;  
  40.     }  
  41.     @Override  
  42.     public Users delete(String id) {  
  43.         System.out.println("DELETE方法,id=" + id);  
  44.         Users user = new Users();  
  45.         user.setUserId("delete");  
  46.         user.setUserName("ickes");  
  47.         user.setUserPwd("ices123");  
  48.         user.setSex(1);  
  49.         user.setSal(32F);  
  50.         user.setBirthday(new Date());  
  51.         return user;  
  52.     }  
  53. }  

四、发布RestFul接口

4.1、使用CXF的API接口进行发布

使用CXF的API接口进行发布的缺点很明显,就是必须指定一个端口进行发布,这个端口不能被占用,占用就会抛出异常。

Java代码 

CXF学习笔记三(发布restFul)
  1. public static void main(String[] args) {  
  2.     JAXRSServerFactoryBean jrf = new JAXRSServerFactoryBean();  
  3.     jrf.setResourceClasses(UserServiceRestFul.class);  
  4.     jrf.setResourceProvider(UserServiceRestFul.class,  
  5.             new SingletonResourceProvider(new UserServiceRestFul()));  
  6.     jrf.setAddress("http://localhost:8080/rest/");  
  7.     jrf.create();  
  8. }  

4.2、在spring容器中进行发布

跟使用CXF发布JAX-WS接口一样,首先必须在web.xml中配置CXFWebServlet,代码如下:

Java代码 

CXF学习笔记三(发布restFul)
  1. <!-- Cxf中使用 CXFServlet,发布跟当前项目端口相同的服务 -->  
  2.     <servlet>  
  3.         <servlet-name>cxfServlet</servlet-name>  
  4.         <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
  5.     </servlet>  
  6.     <servlet-mapping>  
  7.         <servlet-name>cxfServlet</servlet-name>  
  8.         <url-pattern>/cxf  
  9. public class WebClientTest {  
  10.     WebClient client = null;  
  11.     @Before  
  12.     public void init() {  
  13.         client = WebClient.create("http://localhost:8080/rest/");  
  14.     }  
  15.     @Test  
  16.     public void getTest() {  
  17.         // 测试URL传递数据  
  18.         client = WebClient  
  19.                 .create("http://localhost:8080/rest/restFul/get?id=ickes");  
  20.         Users u = client.accept(MediaType.APPLICATION_XML).get(Users.class);  
  21.         System.out.println(u.toJson());  
  22.     }  
  23.     @Test  
  24.     public void putTest() {  
  25.         Users u = new Users();  
  26.         u.setUserId("1");  
  27.         u.setUserName("aa");  
  28.         u.setUserPwd("bbb");  
  29.         client.path("restFul/put/{id}", "ickes")  
  30.                 .accept(MediaType.APPLICATION_XML).put(u);  
  31.     }  
  32.     @Test  
  33.     public void postTest() {  
  34.         Users u = new Users();  
  35.         u.setUserId("1");  
  36.         u.setUserName("aa");  
  37.         u.setUserPwd("bbb");  
  38.         client.accept(MediaType.APPLICATION_XML)  
  39.                 .path("/restFul/post/{id}", "post").post(u);  
  40.     }  
  41.     @Test  
  42.     public void deleteTest() {  
  43.         client.accept(MediaType.APPLICATION_XML)  
  44.                 .path("/restFul/delete/{id}", "post").delete();  
  45.     }  
  46. }  

5.2、使用CXF的客户端工厂类JAXRSClientFactory进行调用(推荐)

这种方式相对比WebClient要更简单,直接使用接口中的方法即可,代码如下:

Java代码 

CXF学习笔记三(发布restFul)
  1. import org.apache.cxf.jaxrs.client.JAXRSClientFactory;  
  2. import org.junit.Before;  
  3. import org.junit.Test;  
  4. public class JAXRSClientFactoryTest {  
  5.     UserService us = null;  
  6.     @Before  
  7.     public void init() {  
  8.         us = JAXRSClientFactory.create("http://localhost:8080/jws/cxf/restFul",UserService.class);  
  9.         System.out.println(us);  
  10.     }  
  11.     @Test  
  12.     public void getTest() {  
  13.         System.out.println(us.get("a").toJson());  
  14.     }  
  15.     @Test  
  16.     public void putTest() {  
  17.         Users u = new Users();  
  18.         u.setUserId("1");  
  19.         u.setUserName("aa");  
  20.         u.setUserPwd("bbb");  
  21.         System.out.println(us.post("a001",u));  
  22.     }  
  23.     @Test  
  24.     public void postTest() {  
  25.         Users u = new Users();  
  26.         u.setUserId("1");  
  27.         u.setUserName("aa");  
  28.         u.setUserPwd("bbb");  
  29.         us.post("POST", u);  
  30.     }  
  31.     @Test  
  32.     public void deleteTest() {  
  33.         us.delete("DELETE");  
  34.     }  
  35. }  

如果想在Spring配置文件中配置org.apache.cxf.jaxrs.client.JAXRSClientFactory,代码如下:

Java代码 

CXF学习笔记三(发布restFul)
  1. <bean id="userService" class="org.apache.cxf.jaxrs.client.JAXRSClientFactory" factory-method="create">  
  2.         <constructor-arg type="java.lang.String" value="http://localhost:8080/rest/" />  
  3.         <constructor-arg type="java.lang.Class" value="com.gosun.jws.cxf.restful.UserService" />  
  4.     </bean>  
CXF学习笔记三(发布restFul)

继续阅读