分别创建服务端和客户端web服务项目,引入jar包:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.1.4.RELEASE</version> <type>jar</type> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-rs-client --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.1.11</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.1.11</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxrs --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>3.1.11</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-rs-extension-providers --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.1.11</version> </dependency> <!-- https://mvnrepository.com/artifact/org.codehaus.jettison/jettison --> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.4.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.26</version> </dependency>
服务端:
添加实体类:
package com.diego.entity; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; /** * 基于RESULT风格的webService,客户端与服务端通讯可以传递xml数据、json数据 * @XmlRootElement 指定对象序列化为XML或JSON数据时 根节点的名称 * xml: * <User> * <id></id> * <userName></userName> * <city></city> * </User> * * json: * {"User":{"id":"1","userName":"","city":""}} */ @XmlRootElement(name = "User") public class User { private String id; private String userName; private String city; public String getId() { return id; } public void setId(String 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; } @Override public String toString() { return "User{" + "id='" + id + '\'' + ", userName='" + userName + '\'' + ", city='" + city + '\'' + '}'; } }
添加接口:
package com.diego.service; import com.diego.entity.User; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import java.util.List; /** * @Path:访问当前服务接口对应的路径 */ public interface IUserService { /** * @Path:访问当前服务接口方法的路径 /userService/user * @POST:处理请求的类型 - 对应insert * @Consumes:服务器支持请求的数据格式类型 * @Produces:服务器支持返回的数据格式类型 */ @POST @Path("/user") @Consumes({MediaType.APPLICATION_XML,MediaType.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") @Produces({"application/xml","application/json"}) public List<User> getUser(User user); /** * @GET:对应查询操作 */ @GET @Path("/user") @Consumes({MediaType.APPLICATION_XML}) @Produces({"application/xml","application/json"}) public User getUserById(User user); /* * @GET:对应查询操作 */ @GET @Path("/user/{id}") @Consumes({MediaType.APPLICATION_JSON}) @Produces({"application/xml","application/json"}) public User getUserById(@PathParam("id") Integer id); /** * @DELETE:对应删除操作 */ @DELETE @Path("/user") @Consumes({"application/xml","application/json"}) public void deleteUser(User user); }
添加实现类:
package com.diego.service.impl; import com.diego.entity.User; import com.diego.service.IUserService; import java.util.ArrayList; import java.util.List; public class IUserServiceImpl implements IUserService { public void saveUser(User user) { System.out.println("saveUser:"+user.toString()); } public void updateUser(User user) { System.out.println("updateUser:"+user.toString()); } public List<User> getUser(User user) { List<User> userList = new ArrayList<User>(); User user1 = new User(); user1.setId("1"); user1.setUserName("1"); user1.setCity("1"); userList.add(user1); User user2 = new User(); user2.setId("2"); user2.setUserName("2"); user2.setCity("2"); userList.add(user2); return userList; } public User getUserById(Integer id) { User user1 = new User(); user1.setId("1"); user1.setUserName("1"); user1.setCity("1"); return user1; } public User getUserById(User user) { User user1 = new User(); user1.setId("111"); user1.setUserName("1111"); user1.setCity("111"); return user1; } public void deleteUser(User user) { System.out.println("deleteUser:"+user.toString()); } }
添加Spring XML配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation="http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-lazy-init="true"> <!-- spring整合CXF发布基于RESULT风格服务 1.服务地址 2.服务类 服务完整访问地址:http:localhost:8083/server/userService/user --> <jaxrs:server address="/userService"> <jaxrs:serviceBeans> <bean class="com.diego.service.impl.IUserServiceImpl"/> </jaxrs:serviceBeans> </jaxrs:server> </beans>
添加web.xml配置:
<servlet> <servlet-name>cxfServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>cxfServlet</servlet-name> <url-pattern>/server/*</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
客户端:
添加实体类:
package com.diego.rs.entity; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; /** * 基于RESULT风格的webService,客户端与服务端通讯可以传递xml数据、json数据 * @XmlRootElement 指定对象序列化为XML或JSON数据时 根节点的名称 * xml: * <User> * <id></id> * <userName></userName> * <city></city> * </User> * * json: * {"User":{"id":"1","userName":"","city":""}} */ @XmlRootElement(name = "User") public class User { private String id; private String userName; private String city; public String getId() { return id; } public void setId(String 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; } @Override public String toString() { return "User{" + "id='" + id + '\'' + ", userName='" + userName + '\'' + ", city='" + city + '\'' + '}'; } }
测试类:
package com.diego.rs; import com.diego.rs.entity.User; import org.apache.cxf.jaxrs.client.WebClient; import org.testng.annotations.Test; import javax.ws.rs.core.MediaType; public class Client { @Test public void test1(){ User user = new User(); user.setId("1"); user.setCity("aaa"); user.setUserName("c"); WebClient.create("http://localhost:8083/server/userService/user") //指定请求的数据格式为XML .type(MediaType.APPLICATION_XML) .post(user); } @Test public void test2(){ User user = WebClient.create("http://localhost:8083/server/userService/user/1") //指定请求的数据格式为JSON .type(MediaType.APPLICATION_JSON) .get(User.class); System.out.println(user.toString()); } }