服务端:
pom.xml
<dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> </configuration> </plugin> </plugins> </build>
实体类:
@XmlRootElement(name = "Car") public class Car { private Integer id; private String carName; private Double price; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getCarName() { return carName; } public void setCarName(String carName) { this.carName = carName; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } @Override public String toString() { return "Car [id=" + id + ", carName=" + carName + ", price=" + price + "]"; } }
@XmlRootElement(name = "User") public class User { private Integer id; private String username; private String city; private List<Car> cars = new ArrayList<Car>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public List<Car> getCars() { return cars; } public void setCars(List<Car> cars) { this.cars = cars; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", city=" + city + ", cars=" + cars + "]"; } }
服务类
// 访问当前服务接口对应的路径 @Path("/userService") @Produces("*/*") // 服务器支持的返回的数据格式类型 public interface IUserService { // 表示处理的请求的类型,post 对应的是insert新增操作 @POST // 访问当前服务接口方法对应的路径。 【.../userService/user】 @Path("/user") // 服务器支持的请求的数据格式类型 @Consumes({ "application/xml", "application/json" }) public void saveUser(User user); // 表示处理的请求的类型,put 对应的是update修改操作 @PUT @Path("/user") @Consumes({ "application/xml", "application/json" }) public void updateUser(User user); // 表示处理的请求的类型,get 对应的是查询修改操作 @GET @Path("/user") @Consumes("application/json") // 服务器支持的返回的数据格式类型 @Produces({ "application/xml", "application/json" }) public List<User> findAllUsers(); @GET @Path("/user/{id}") @Consumes("application/xml") @Produces({ "application/xml", "application/json" }) public User finUserById(@PathParam("id") Integer id); // 表示处理的请求的类型,delete 对应的是删除操作 @DELETE @Path("/user/{id}") @Consumes({"application/xml", "application/json"}) public void deleteUser(@PathParam("id") Integer id); }
public class UserServiceImpl implements IUserService { @Override public void saveUser(User user) { System.out.println("save user:" + user); } @Override public void updateUser(User user) { System.out.println("update user:" + user); } @Override public List<User> findAllUsers() { List<User> users = new ArrayList<User>(); User user1 = new User(); user1.setId(1); user1.setUsername("小明"); user1.setCity("北京"); List<Car> carList1 = new ArrayList<Car>(); Car car1 = new Car(); car1.setId(101); car1.setCarName("保时捷"); car1.setPrice(1000000d); carList1.add(car1); Car car2 = new Car(); car2.setId(102); car2.setCarName("宝马"); car2.setPrice(400000d); carList1.add(car2); user1.setCars(carList1); users.add(user1); User user2 = new User(); user2.setId(2); user2.setUsername("小丽"); user2.setCity("上海"); users.add(user2); return users; } @Override public User finUserById(Integer id) { if (id == 1) { User user1 = new User(); user1.setId(1); user1.setUsername("小明"); user1.setCity("北京"); return user1; } return null; } @Override public void deleteUser(Integer id) { System.out.println("delete user id :" + id); } }
启动测试类:
public class Server { public static void main(String[] args) { // 创建发布服务的工厂 JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean(); // 设置服务地址 factory.setAddress("http://localhost:8001/ws/"); // 设置服务类 factory.setServiceBean(new UserServiceImpl()); // 添加日志输入输出拦截器 factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); // 发布服务 factory.create(); System.out.println("发布服务成功,端口8001"); } }
客户端:
pom.xml
<dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> </configuration> </plugin> </plugins> </build>
实体类:
和服务端一样,这里就不贴出来了。
测试类:
@Test public void testSave(){ User user = new User(); user.setId(100); user.setUsername("Jerry"); user.setCity("gz"); // 通过WebClient对象远程调用服务端 WebClient .create("http://localhost:8001/ws/userService/user") .type(MediaType.APPLICATION_JSON) // 指定请求的数据格式为json .post(user); }
@Test public void testGet(){ // 查询一个 User user = WebClient .create("http://localhost:8001/ws/userService/user/1") .accept(MediaType.APPLICATION_JSON) .get(User.class); System.out.println(user); }
@Test public void testUpdate(){ User user = new User(); user.setId(100); user.setUsername("Jerry"); user.setCity("gz"); WebClient .create("http://localhost:8001/ws/userService/user") .accept(MediaType.APPLICATION_XML) .put(user); System.out.println(user); }