一、简介
资源驱动。基于HTTP协议[按照标准指定URL,就可以访问数据]以XML|JSON格式传输数据。
二、quickstart
1、创建maven project[Packaging:jar]
2、导入依赖
1 23 7 8org.apache.cxf 4cxf-rt-frontend-jaxrs 53.0.1 69 13 14org.apache.cxf 10cxf-rt-transports-http-jetty 113.0.1 1215 org.slf4j 16slf4j-log4j12 171.7.12 18
3、搭建服务端
3.1、导入实体bean
3.2、构建服务bean
3.2.1、IUserService.java
1 package org.cxf_rs.service; 2 3 import java.util.List; 4 import org.cxf_rs.domain.User; 5 6 public interface IUserService { 7 //增 8 public void saveUser(User user); 9 //删10 public void deleteUser(Integer id);11 //改12 public void updateUser(User user);13 //查-查询所有14 public ListfindAllUsers();15 //查-根据id查询16 public User finUserById(Integer id);17 }
3.2.2、UserServiceImpl.java
1 package org.cxf_rs.service; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.cxf_rs.domain.Car; 7 import org.cxf_rs.domain.User; 8 9 10 public class UserServiceImpl implements IUserService {11 //增12 public void saveUser(User user) {13 System.out.println("save user:" + user);14 }15 //删16 public void deleteUser(Integer id) {17 System.out.println("delete user id :" + id);18 }19 //改20 public void updateUser(User user) {21 System.out.println("update user:" + user);22 }23 //查-查询所有24 public ListfindAllUsers() {25 List users = new ArrayList ();26 User user1 = new User();27 user1.setId(1);28 user1.setUsername("小明");29 user1.setCity("北京");30 31 List carList1 = new ArrayList ();32 Car car1 = new Car();33 car1.setId(101);34 car1.setCarName("保时捷");35 car1.setPrice(1000000d);36 carList1.add(car1);37 Car car2 = new Car();38 car2.setId(102);39 car2.setCarName("宝马");40 car2.setPrice(400000d);41 carList1.add(car2);42 user1.setCars(carList1);43 44 users.add(user1);45 46 User user2 = new User();47 user2.setId(2);48 user2.setUsername("小丽");49 user2.setCity("上海");50 users.add(user2);51 52 return users;53 }54 //查-根据id查询55 public User finUserById(Integer id) {56 if (id == 1) {57 User user1 = new User();58 user1.setId(1);59 user1.setUsername("小明");60 user1.setCity("北京");61 return user1;62 }63 return null;64 }65 }
3.3、添加注解
3.3.1、domain[加@XmlRootElement注解]
未加的话报如下错误:
3.3.2、service
①常用注解
②IUserService.java带注解
1 package org.cxf_rs.service; 2 3 import java.util.List; 4 5 import javax.ws.rs.Consumes; 6 import javax.ws.rs.DELETE; 7 import javax.ws.rs.GET; 8 import javax.ws.rs.POST; 9 import javax.ws.rs.PUT;10 import javax.ws.rs.Path;11 import javax.ws.rs.PathParam;12 import javax.ws.rs.Produces;13 14 import org.cxf_rs.domain.User;15 16 17 @Path("/userService")18 @Produces("*/*")19 public interface IUserService {20 //增21 @POST22 @Path("/user")23 @Consumes({ "application/xml", "application/json" })24 public void saveUser(User user);25 //删26 @DELETE27 @Path("/user/{id}")28 @Consumes("application/xml")29 public void deleteUser(@PathParam("id") Integer id);30 //改31 @PUT32 @Path("/user")33 @Consumes({ "application/xml", "application/json" })34 public void updateUser(User user);35 //查-查询所有36 @GET37 @Path("/user")38 @Produces({ "application/xml", "application/json" })39 public ListfindAllUsers();40 //查-根据id查询41 @GET42 @Path("/user/{id}")43 @Consumes("application/xml")44 @Produces({ "application/xml", "application/json" })45 public User finUserById(@PathParam("id") Integer id);46 }
4、发布服务
1 package org.cxf_rs.server; 2 3 import org.apache.cxf.interceptor.LoggingInInterceptor; 4 import org.apache.cxf.interceptor.LoggingOutInterceptor; 5 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; 6 import org.cxf_rs.domain.Car; 7 import org.cxf_rs.domain.User; 8 import org.cxf_rs.service.IUserService; 9 import org.cxf_rs.service.UserServiceImpl;10 11 12 public class JAX_RS_Server {13 public static void main(String[] args) {14 // 创建业务接口实现类对象15 IUserService userService = new UserServiceImpl();16 // 服务器FactoryBean创建服务17 JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();18 restServer.setResourceClasses(User.class, Car.class);19 restServer.setServiceBean(userService);20 restServer.setAddress("http://localhost:9999/");21 // 打印日志22 restServer.getInInterceptors().add(new LoggingInInterceptor());23 restServer.getOutInterceptors().add(new LoggingOutInterceptor());24 // 发布服务25 restServer.create();26 System.out.println("服务器启动成功!");27 }28 }
5、客户端测试
5.1、浏览器测试
5.1.1、查询所有
查询所有:
5.1.2、根据id查询
根据id查询:
5.2、WebClient 工具类[CXF 自带的工具包]
5.2.1、导入依赖
1 23 org.apache.cxf 4cxf-rt-rs-client 53.0.1 6
5.2.2、目录结构
5.2.3、JAX_RS_Client.java
① 测试新增
1 // 测试新增 2 @Test 3 public void test_save(){ 4 /** 5 * create :建立与调用服务资源路径连接 6 * path :访问服务器的路径--->@Path 7 * type :发送给服务器数据格式--->@Consumes 8 * accept :接收服务器传输数据格式--->@Produces 9 */10 User user = new User();11 user.setId(3);12 user.setUsername("小美");13 user.setCity("深圳");14 WebClient.create("http://localhost:9999/").path("userService/user").type(MediaType.APPLICATION_JSON).post(user);15 }
②测试删除
1 // 测试删除 2 @Test 3 public void test_delete(){ 4 /** 5 * create :建立与调用服务资源路径连接 6 * path :访问服务器的路径--->@Path 7 * type :发送给服务器数据格式--->@Consumes 8 * accept :接收服务器传输数据格式--->@Produces 9 */10 // 删除11 WebClient.create("http://localhost:9999/").path("userService/user/1").type(MediaType.APPLICATION_XML).delete();12 }
③测试修改
1 // 测试修改 2 @Test 3 public void test_update(){ 4 /** 5 * create :建立与调用服务资源路径连接 6 * path :访问服务器的路径--->@Path 7 * type :发送给服务器数据格式--->@Consumes 8 * accept :接收服务器传输数据格式--->@Produces 9 */10 User user = new User();11 user.setId(3);12 user.setUsername("小美");13 user.setCity("深圳");14 // 修改15 WebClient.create("http://localhost:9999/").path("userService/user").type(MediaType.APPLICATION_JSON).put(user);16 }
④测试查询所有
1 // 测试查询所有 2 @Test 3 public void test_findAll() { 4 /** 5 * create :建立与调用服务资源路径连接 6 * path :访问服务器的路径--->@Path 7 * type :发送给服务器数据格式--->@Consumes 8 * accept :接收服务器传输数据格式--->@Produces 9 */10 // 查询所有用户11 Collection users = WebClient.create("http://localhost:9999/userService/user").accept(MediaType.APPLICATION_XML).getCollection(User.class);12 System.out.println("查询所有用户" + users);13 }
⑤测试根据id查询
1 // 测试根据id查询 2 @Test 3 public void test_findById() { 4 /** 5 * create :建立与调用服务资源路径连接 6 * path :访问服务器的路径--->@Path 7 * type :发送给服务器数据格式--->@Consumes 8 * accept :接收服务器传输数据格式--->@Produces 9 */10 WebClient client = WebClient.create("http://localhost:9999/");11 User responseUser = client.path("userService/user/1").accept(MediaType.APPLICATION_XML).get(User.class);12 System.out.println("根据id查询" + responseUser);13 }
5.2.4、测试新增报异常
①异常描述
Caused by: javax.ws.rs.ProcessingException: No message body writer has been found for class cn.itcast.cxf.domain.User, ContentType: application/json
②出现原因
测试时传输JSON格式的数据
③解决方案
引入json转换器的依赖
1 23 7 8org.apache.cxf 4cxf-rt-rs-extension-providers 53.0.1 69 org.codehaus.jettison 10jettison 111.3.7 12