Spring整合CXF,发布RSETful 风格WebService
这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的。关于发布CXF WebServer和Spring整合CXF这里就不再多加赘述了。如果你对Spring整合CXF WebService不了解,具体你可以参看这两篇文章:
http://www.cnblogs.com/hoojo/archive/2011/03/30/1999563.html
http://www.cnblogs.com/hoojo/archive/2012/07/13/2590593.html
如果你不了解restful风格的WebService,你可以参考:
http://www.oracle.com/technetwork/articles/javase/index-137171.html
SpringMVC对RESTful的支持:
http://www.cnblogs.com/hoojo/archive/2011/06/10/2077422.html
使用 Jersey框架,搭建RESTful WebService(这个也比较简单)
http://www.ibm.com/developerworks/cn/web/wa-aj-tomcat/
官方文档:http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e8
其中,比较常用的RESTful框架就有Jersey、Spring REST、CXF RESTful,这些都可以很好的整合Spring框架,发布也相当的简单。且简单、易用、易上手,文档也比较丰富。
开发环境:
System:Windows
JavaEE Server:tomcat6
JavaSDK: jdk6+
IDE:eclipse、MyEclipse 6.6
开发依赖库:
JDK6、 JavaEE5、CXF-2.3.3、Spring 3.0.4
Email:[email protected]
Blog:http://blog.csdn.net/IBM_hoojo
下面我们就接着http://www.cnblogs.com/hoojo/archive/2011/03/30/1999563.html这篇文章,开始我们CXF RESTful WebService的旅程,enjoy~!^_*
准备工作
首先,你需要添加相关的jar包
其中,jsr331-api-1.1.1.jar是必须的,利用CXF发布REST服务得用到它,在cxf的lib库中可以找到这个jar。
下载地址:http://www.apache.org/dyn/closer.cgi?path=/cxf/2.3.11/apache-cxf-2.3.11.zip
其它的jar包都是非必须的!
JavaEntity
package com.hoo.entity;<!--CRLF--><!--CRLF-->
import java.util.Map;<!--CRLF-->
import javax.xml.bind.annotation.XmlRootElement;<!--CRLF--><!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> MapBean 封装Map集合元素<!--CRLF-->
* @author hoojo<!--CRLF-->
* @createDate 2012-7-20 下午01:22:31<!--CRLF-->
* @file MapBean.java<!--CRLF-->
* @package com.hoo.entity<!--CRLF-->
* @project CXFWebService<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo<!--CRLF-->
* @email [email protected]<!--CRLF-->
* @version 1.0<!--CRLF-->
*/<!--CRLF-->
@XmlRootElement<!--CRLF-->
public class MapBean {<!--CRLF-->
private Map<String, User> map;<!--CRLF--><!--CRLF-->
//@XmlElement(type = User.class)<!--CRLF-->
public Map<String, User> getMap() {<!--CRLF-->
return map;<!--CRLF-->
}<!--CRLF-->
public void setMap(Map<String, User> map) {<!--CRLF-->
this.map = map;<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
package com.hoo.entity;<!--CRLF--><!--CRLF-->
import java.util.HashMap;<!--CRLF-->
import java.util.List;<!--CRLF-->
import javax.xml.bind.annotation.XmlRootElement;<!--CRLF--><!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> Users Entity<!--CRLF-->
* @author hoojo<!--CRLF-->
* @createDate 2011-3-18 上午09:27:31<!--CRLF-->
* @file Users.java<!--CRLF-->
* @package com.hoo.entity<!--CRLF-->
* @project CXFWebService<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo<!--CRLF-->
* @email [email protected]<!--CRLF-->
* @version 1.0<!--CRLF-->
*/<!--CRLF-->
@XmlRootElement(name = "UserInfos")<!--CRLF-->
public class Users {<!--CRLF-->
private List<User> users;<!--CRLF--><!--CRLF-->
private User[] userArr;<!--CRLF--><!--CRLF-->
private HashMap<String, User> maps;<!--CRLF--><!--CRLF--><!--CRLF-->
// getter/setter<!--CRLF-->
}<!--CRLF-->
package com.hoo.entity;<!--CRLF--><!--CRLF-->
import java.io.Serializable;<!--CRLF-->
import javax.xml.bind.annotation.XmlRootElement;<!--CRLF--><!--CRLF-->
/**<!--CRLF-->
* <b>function:</b>User Entity<!--CRLF-->
* @author hoojo<!--CRLF-->
* @createDate Dec 16, 2010 10:20:02 PM<!--CRLF-->
* @file User.java<!--CRLF-->
* @package com.hoo.entity<!--CRLF-->
* @project AxisWebService<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo<!--CRLF-->
* @email [email protected]<!--CRLF-->
* @version 1.0<!--CRLF-->
*/<!--CRLF-->
@XmlRootElement(name = "UserInfo")<!--CRLF-->
public class User implements Serializable {<!--CRLF-->
private static final long serialVersionUID = 677484458789332877L;<!--CRLF-->
private int id;<!--CRLF-->
private String name;<!--CRLF-->
private String email;<!--CRLF-->
private String address;<!--CRLF--><!--CRLF-->
//getter/setter<!--CRLF--><!--CRLF-->
@Override<!--CRLF-->
public String toString() {<!--CRLF-->
return this.id + "#" + this.name + "#" + this.email + "#" + this.address;<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
一、定义你的WebService的接口RESTSample.java,代码如下
package com.hoo.service;<!--CRLF--><!--CRLF-->
import java.io.IOException;<!--CRLF-->
import javax.servlet.http.HttpServletRequest;<!--CRLF-->
import javax.servlet.http.HttpServletResponse;<!--CRLF-->
import javax.ws.rs.Consumes;<!--CRLF-->
import javax.ws.rs.DELETE;<!--CRLF-->
import javax.ws.rs.GET;<!--CRLF-->
import javax.ws.rs.POST;<!--CRLF-->
import javax.ws.rs.PUT;<!--CRLF-->
import javax.ws.rs.Path;<!--CRLF-->
import javax.ws.rs.PathParam;<!--CRLF-->
import javax.ws.rs.Produces;<!--CRLF-->
import javax.ws.rs.core.Context;<!--CRLF-->
import javax.ws.rs.core.MediaType;<!--CRLF--><!--CRLF-->
import com.hoo.entity.MapBean;<!--CRLF-->
import com.hoo.entity.User;<!--CRLF-->
import com.hoo.entity.Users;<!--CRLF--><!--CRLF--><!--CRLF-->
/*<!--CRLF-->
注释(Annotation):在 javax.ws.rs.* 中定义,是 JAX-RS (JSR 311) 规范的一部分。<!--CRLF-->
@Path:定义资源基 URI。由上下文根和主机名组成,资源标识符类似于 http://localhost:8080/RESTful/rest/hello。<!--CRLF-->
@GET:这意味着以下方法可以响应 HTTP GET 方法。<!--CRLF-->
@Produces:以纯文本方式定义响应内容 MIME 类型。<!--CRLF--><!--CRLF-->
@Context: 使用该注释注入上下文对象,比如 Request、Response、UriInfo、ServletContext 等。<!--CRLF-->
@Path("{contact}"):这是 @Path 注释,与根路径 “/contacts” 结合形成子资源的 URI。<!--CRLF-->
@PathParam("contact"):该注释将参数注入方法参数的路径,在本例中就是联系人 id。其他可用的注释有 @FormParam、@QueryParam 等。<!--CRLF-->
@Produces:响应支持多个 MIME 类型。在本例和上一个示例中,APPLICATION/XML 将是默认的 MIME 类型。<!--CRLF-->
*/<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> CXF RESTful风格WebService<!--CRLF-->
* @author hoojo<!--CRLF-->
* @createDate 2012-7-20 下午01:23:04<!--CRLF-->
* @file RESTSampleSource.java<!--CRLF-->
* @package com.hoo.service<!--CRLF-->
* @project CXFWebService<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo<!--CRLF-->
* @email [email protected]<!--CRLF-->
* @version 1.0<!--CRLF-->
*/<!--CRLF-->
@Path(value = "/sample")<!--CRLF-->
public interface RESTSample {<!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Produces(MediaType.TEXT_PLAIN)<!--CRLF-->
public String doGet();<!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Produces(MediaType.TEXT_PLAIN)<!--CRLF-->
@Path("/request/{param}")<!--CRLF-->
public String doRequest(@PathParam("param") String param,<!--CRLF-->
@Context HttpServletRequest servletRequest, @Context HttpServletResponse servletResponse);<!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Path("/bean/{id}")<!--CRLF-->
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })<!--CRLF-->
public User getBean(@PathParam("id") int id);<!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Path("/list")<!--CRLF-->
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })<!--CRLF-->
public Users getList();<!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Path("/map")<!--CRLF-->
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })<!--CRLF-->
public MapBean getMap();<!--CRLF--><!--CRLF-->
/*<!--CRLF-->
@Consumes:声明该方法使用 HTML FORM。<!--CRLF-->
@FormParam:注入该方法的 HTML 属性确定的表单输入。<!--CRLF-->
@Response.created(uri).build(): 构建新的 URI 用于新创建的联系人(/contacts/{id})并设置响应代码(201/created)。<!--CRLF-->
您可以使用 http://localhost:8080/Jersey/rest/contacts/<id> 访问新联系人<!--CRLF-->
*/<!--CRLF-->
@POST<!--CRLF-->
@Path("/postData")<!--CRLF-->
public User postData(User user) throws IOException;<!--CRLF--><!--CRLF-->
@PUT<!--CRLF-->
@Path("/putData/{id}")<!--CRLF-->
@Consumes(MediaType.APPLICATION_XML)<!--CRLF-->
public User putData(@PathParam("id") int id, User user);<!--CRLF--><!--CRLF-->
@DELETE<!--CRLF-->
@Path("/removeData/{id}")<!--CRLF-->
public void deleteData(@PathParam("id") int id);<!--CRLF-->
}<!--CRLF-->
二、RESTSample接口的实现,这里我们只是简单的实现下,并不是涉及实际的具体业务
package com.hoo.service;<!--CRLF--><!--CRLF-->
import java.io.IOException;<!--CRLF-->
import java.util.ArrayList;<!--CRLF-->
import java.util.HashMap;<!--CRLF-->
import java.util.List;<!--CRLF-->
import java.util.Map;<!--CRLF-->
import javax.servlet.http.HttpServletRequest;<!--CRLF-->
import javax.servlet.http.HttpServletResponse;<!--CRLF-->
import javax.ws.rs.DELETE;<!--CRLF-->
import javax.ws.rs.GET;<!--CRLF-->
import javax.ws.rs.POST;<!--CRLF-->
import javax.ws.rs.PUT;<!--CRLF-->
import javax.ws.rs.Path;<!--CRLF-->
import javax.ws.rs.PathParam;<!--CRLF-->
import javax.ws.rs.Produces;<!--CRLF-->
import javax.ws.rs.core.Context;<!--CRLF-->
import javax.ws.rs.core.MediaType;<!--CRLF-->
import javax.ws.rs.core.Request;<!--CRLF-->
import javax.ws.rs.core.UriInfo;<!--CRLF-->
import com.hoo.entity.MapBean;<!--CRLF-->
import com.hoo.entity.User;<!--CRLF-->
import com.hoo.entity.Users;<!--CRLF--><!--CRLF--><!--CRLF-->
/*<!--CRLF-->
注释(Annotation):在 javax.ws.rs.* 中定义,是 JAX-RS (JSR 311) 规范的一部分。<!--CRLF-->
@Path:定义资源基 URI。由上下文根和主机名组成,资源标识符类似于 http://localhost:8080/RESTful/rest/hello。<!--CRLF-->
@GET:这意味着以下方法可以响应 HTTP GET 方法。<!--CRLF-->
@Produces:以纯文本方式定义响应内容 MIME 类型。<!--CRLF--><!--CRLF-->
@Context: 使用该注释注入上下文对象,比如 Request、Response、UriInfo、ServletContext 等。<!--CRLF-->
@Path("{contact}"):这是 @Path 注释,与根路径 “/contacts” 结合形成子资源的 URI。<!--CRLF-->
@PathParam("contact"):该注释将参数注入方法参数的路径,在本例中就是联系人 id。其他可用的注释有 @FormParam、@QueryParam 等。<!--CRLF-->
@Produces:响应支持多个 MIME 类型。在本例和上一个示例中,APPLICATION/XML 将是默认的 MIME 类型。<!--CRLF-->
*/<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> CXF RESTful风格WebService<!--CRLF-->
* @author hoojo<!--CRLF-->
* @createDate 2012-7-20 下午01:23:04<!--CRLF-->
* @file RESTSampleSource.java<!--CRLF-->
* @package com.hoo.service<!--CRLF-->
* @project CXFWebService<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo<!--CRLF-->
* @email [email protected]<!--CRLF-->
* @version 1.0<!--CRLF-->
*/<!--CRLF-->
@Path(value = "/sample")<!--CRLF-->
public class RESTSampleSource implements RESTSample {<!--CRLF--><!--CRLF-->
@Context<!--CRLF-->
private UriInfo uriInfo;<!--CRLF--><!--CRLF-->
@Context<!--CRLF-->
private Request request;<!--CRLF--><!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Produces(MediaType.TEXT_PLAIN)<!--CRLF-->
public String doGet() {<!--CRLF-->
return "this is get rest request";<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Produces(MediaType.TEXT_PLAIN)<!--CRLF-->
@Path("/request/{param}")<!--CRLF-->
public String doRequest(@PathParam("param") String param,<!--CRLF-->
@Context HttpServletRequest servletRequest, @Context HttpServletResponse servletResponse) {<!--CRLF-->
System.out.println(servletRequest);<!--CRLF-->
System.out.println(servletResponse);<!--CRLF-->
System.out.println(servletRequest.getParameter("param"));<!--CRLF-->
System.out.println(servletRequest.getContentType());<!--CRLF-->
System.out.println(servletResponse.getCharacterEncoding());<!--CRLF-->
System.out.println(servletResponse.getContentType());<!--CRLF-->
return "success";<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Path("/bean/{id}")<!--CRLF-->
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })<!--CRLF-->
public User getBean(@PathParam("id") int id) {<!--CRLF-->
System.out.println("####getBean#####");<!--CRLF-->
System.out.println("id:" + id);<!--CRLF-->
System.out.println("Method:" + request.getMethod());<!--CRLF-->
System.out.println("uri:" + uriInfo.getPath());<!--CRLF-->
System.out.println(uriInfo.getPathParameters());<!--CRLF--><!--CRLF-->
User user = new User();<!--CRLF-->
user.setId(id);<!--CRLF-->
user.setName("JojO");<!--CRLF-->
return user;<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Path("/list")<!--CRLF-->
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })<!--CRLF-->
public Users getList() {<!--CRLF-->
System.out.println("####getList#####");<!--CRLF-->
System.out.println("Method:" + request.getMethod());<!--CRLF-->
System.out.println("uri:" + uriInfo.getPath());<!--CRLF-->
System.out.println(uriInfo.getPathParameters());<!--CRLF--><!--CRLF-->
List<User> list = new ArrayList<User>();<!--CRLF-->
User user = null;<!--CRLF-->
for (int i = 0; i < 4;i ++) {<!--CRLF-->
user = new User();<!--CRLF-->
user.setId(i);<!--CRLF-->
user.setName("JojO-" + i);<!--CRLF-->
list.add(user);<!--CRLF-->
}<!--CRLF-->
Users users = new Users();<!--CRLF-->
users.setUsers(list);<!--CRLF-->
return users;<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@GET<!--CRLF-->
@Path("/map")<!--CRLF-->
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })<!--CRLF-->
public MapBean getMap() {<!--CRLF-->
System.out.println("####getMap#####");<!--CRLF-->
System.out.println("Method:" + request.getMethod());<!--CRLF-->
System.out.println("uri:" + uriInfo.getPath());<!--CRLF-->
System.out.println(uriInfo.getPathParameters());<!--CRLF--><!--CRLF-->
Map<String, User> map = new HashMap<String, User>();<!--CRLF-->
User user = null;<!--CRLF-->
for (int i = 0; i < 4;i ++) {<!--CRLF-->
user = new User();<!--CRLF-->
user.setId(i);<!--CRLF-->
user.setName("JojO-" + i);<!--CRLF-->
map.put("key-" + i, user);<!--CRLF-->
}<!--CRLF-->
MapBean bean = new MapBean();<!--CRLF-->
bean.setMap(map);<!--CRLF-->
return bean;<!--CRLF-->
}<!--CRLF--><!--CRLF-->
/*<!--CRLF-->
@Consumes:声明该方法使用 HTML FORM。<!--CRLF-->
@FormParam:注入该方法的 HTML 属性确定的表单输入。<!--CRLF-->
@Response.created(uri).build(): 构建新的 URI 用于新创建的联系人(/contacts/{id})并设置响应代码(201/created)。<!--CRLF-->
您可以使用 http://localhost:8080/Jersey/rest/contacts/<id> 访问新联系人<!--CRLF-->
*/<!--CRLF-->
@POST<!--CRLF-->
@Path("/postData")<!--CRLF-->
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })<!--CRLF-->
public User postData(User user) throws IOException {<!--CRLF-->
System.out.println(user);<!--CRLF-->
user.setName("jojo##12321321");<!--CRLF-->
return user;<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@PUT<!--CRLF-->
@Path("/putData/{id}")<!--CRLF-->
@Produces({ MediaType.APPLICATION_XML })<!--CRLF-->
public User putData(@PathParam("id") int id, User user) {<!--CRLF-->
System.out.println("#####putData#####");<!--CRLF-->
System.out.println(user);<!--CRLF-->
user.setId(id);<!--CRLF-->
user.setAddress("hoojo#gz");<!--CRLF-->
user.setEmail("[email protected]");<!--CRLF-->
user.setName("hoojo");<!--CRLF-->
System.out.println(user);<!--CRLF-->
return user;<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@DELETE<!--CRLF-->
@Path("/removeData/{id}")<!--CRLF-->
public void deleteData(@PathParam("id") int id) {<!--CRLF-->
System.out.println("#######deleteData#######" + id);<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
<?xml version="1.0" encoding="UTF-8"?><!--CRLF-->
<beans xmlns="http://www.springframework.org/schema/beans"<!--CRLF-->
xmlns:context="http://www.springframework.org/schema/context"<!--CRLF-->
xmlns:jaxws="http://cxf.apache.org/jaxws"<!--CRLF-->
xmlns:jaxrs="http://cxf.apache.org/jaxrs"<!--CRLF-->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<!--CRLF-->
xsi:schemaLocation="http://www.springframework.org/schema/beans<!--CRLF-->
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd<!--CRLF-->
http://www.springframework.org/schema/context<!--CRLF-->
http://www.springframework.org/schema/context/spring-context-3.0.xsd<!--CRLF-->
http://cxf.apache.org/jaxws<!--CRLF-->
http://cxf.apache.org/schemas/jaxws.xsd<!--CRLF-->
http://cxf.apache.org/jaxrs<!--CRLF-->
http://cxf.apache.org/schemas/jaxrs.xsd"><!--CRLF-->
<import resource="classpath:META-INF/cxf/cxf.xml"/><!--CRLF-->
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/><!--CRLF-->
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/><!--CRLF-->
<bean id="restSample" class="com.hoo.service.RESTSampleSource"/><!--CRLF-->
<!-- 这里的地址很重要,客户端需要通过这个地址来访问WebService --><!--CRLF-->
<jaxrs:server id="restServiceContainer" address="/rest"><!--CRLF-->
<jaxrs:serviceBeans><!--CRLF-->
<ref bean="restSample" /><!--CRLF-->
</jaxrs:serviceBeans><!--CRLF-->
<jaxrs:extensionMappings><!--CRLF-->
<entry key="json" value="application/json" /><!--CRLF-->
<entry key="xml" value="application/xml" /><!--CRLF-->
</jaxrs:extensionMappings><!--CRLF-->
<jaxrs:languageMappings><!--CRLF-->
<entry key="en" value="en-gb"/><!--CRLF-->
</jaxrs:languageMappings><!--CRLF-->
</jaxrs:server><!--CRLF-->
这样服务器端就完成了CXF RESTful WebService的发布,启动你的tomcat。然后在浏览器中服务地址:http://localhost:8000/CXFWebService/ (其实这里请求的是CXFServlet,你可以看看上一篇Spring整合CXF文章的web.xml的配置)
你就可以看到我们这里刚刚发布的RESTSample rest的WebService
你也可以看看里面的xml,也就是WebService的wsdl文件内容。我们找一个GET方式的WebService的方法,在浏览器中调用一下试试
http://localhost:8000/CXFWebService/rest/sample/bean/123
这个url对应到下面这个方法
@GET<!--CRLF-->
@Path("/bean/{id}")<!--CRLF-->
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })<!--CRLF-->
public User getBean(@PathParam("id") int id)<!--CRLF-->
结果如下
一篇xml文档内容。
四、编写客户端代码,调用RESTful WebService
package com.hoo.client;<!--CRLF--><!--CRLF-->
import java.io.IOException;<!--CRLF-->
import javax.ws.rs.core.MediaType;<!--CRLF-->
import org.apache.cxf.jaxrs.client.WebClient;<!--CRLF-->
import org.junit.After;<!--CRLF-->
import org.junit.Before;<!--CRLF-->
import org.junit.Test;<!--CRLF-->
import org.springframework.context.ApplicationContext;<!--CRLF-->
import org.springframework.context.support.ClassPathXmlApplicationContext;<!--CRLF-->
import com.hoo.entity.MapBean;<!--CRLF-->
import com.hoo.entity.User;<!--CRLF-->
import com.hoo.entity.Users;<!--CRLF-->
import com.hoo.service.RESTSample;<!--CRLF--><!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> RESTful风格WebService<!--CRLF-->
* @author hoojo<!--CRLF-->
* @createDate 2012-7-20 下午03:31:03<!--CRLF-->
* @file RSETServiceClient.java<!--CRLF-->
* @package com.hoo.client<!--CRLF-->
* @project CXFWebService<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo<!--CRLF-->
* @email [email protected]<!--CRLF-->
* @version 1.0<!--CRLF-->
*/<!--CRLF-->
public class RSETServiceClient {<!--CRLF--><!--CRLF-->
private static WebClient client;<!--CRLF--><!--CRLF-->
@Before<!--CRLF-->
public void init() {<!--CRLF-->
// 手动创建webClient对象,注意这里的地址是发布的那个/rest地址<!--CRLF-->
//String url = "http://localhost:8000/CXFWebService/rest/";<!--CRLF-->
//client = WebClient.create(url);<!--CRLF--><!--CRLF-->
// 从Spring Ioc容器中拿webClient对象<!--CRLF-->
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");<!--CRLF-->
client = ctx.getBean("webClient", WebClient.class);<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@After<!--CRLF-->
public void destory(){<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@Test<!--CRLF-->
public void testGet() {<!--CRLF-->
System.out.println(client.path("sample").accept(MediaType.TEXT_PLAIN).get(String.class));<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@Test<!--CRLF-->
public void testRequest() {<!--CRLF-->
System.out.println(client.path("sample/request/234234").accept(MediaType.TEXT_PLAIN).get(String.class));<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@Test<!--CRLF-->
public void testBean() {<!--CRLF-->
User user = client.path("sample/bean/{id}", 25).accept(MediaType.APPLICATION_XML).get(User.class);<!--CRLF-->
System.out.println(user);<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@Test<!--CRLF-->
public void testList() {<!--CRLF-->
System.out.println(client.path("sample/list").accept(MediaType.APPLICATION_XML).get(Users.class).getUsers());<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@Test<!--CRLF-->
public void testMap() {<!--CRLF-->
System.out.println(client.path("sample/map").accept(MediaType.APPLICATION_XML).get(MapBean.class).getMap());<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@Test<!--CRLF-->
public void testDeleteData() {<!--CRLF-->
client.path("sample/removeData/23").delete();<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@Test<!--CRLF-->
public void testPostData() {<!--CRLF-->
User user = new User();<!--CRLF-->
user.setId(21432134);<!--CRLF-->
user.setAddress("hoojo#gz");<!--CRLF-->
user.setEmail("[email protected]");<!--CRLF-->
user.setName("hoojo");<!--CRLF-->
System.out.println(client.path("sample/postData").accept(MediaType.APPLICATION_XML).post(user, User.class));<!--CRLF-->
}<!--CRLF--><!--CRLF-->
@Test<!--CRLF-->
public void testPutData() {<!--CRLF-->
User user = new User();<!--CRLF-->
user.setId(21432134);<!--CRLF-->
System.out.println(client.path("sample/putData/1").accept(MediaType.APPLICATION_XML).put(user).getEntity());<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
<?xml version="1.0" encoding="UTF-8"?><!--CRLF-->
<beans xmlns="http://www.springframework.org/schema/beans"<!--CRLF-->
xmlns:context="http://www.springframework.org/schema/context"<!--CRLF-->
xmlns:jaxws="http://cxf.apache.org/jaxws"<!--CRLF-->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<!--CRLF-->
xsi:schemaLocation="http://www.springframework.org/schema/beans<!--CRLF-->
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd<!--CRLF-->
http://www.springframework.org/schema/context<!--CRLF-->
http://www.springframework.org/schema/context/spring-context-3.0.xsd<!--CRLF-->
http://cxf.apache.org/jaxws<!--CRLF-->
http://cxf.apache.org/schemas/jaxws.xsd"><!--CRLF--><!--CRLF-->
<bean id="webClient" class="org.apache.cxf.jaxrs.client.WebClient" factory-method="create"><!--CRLF-->
<constructor-arg type="java.lang.String" value="http://localhost:8000/CXFWebService/rest/" /><!--CRLF-->
</bean><!--CRLF--><!--CRLF-->
</beans><!--CRLF-->
这种是利用WebClient对象来调用WebService,还有一种方法也可以调用WebService,代码如下:
// 手动创建<!--CRLF-->
//RESTSample sample = JAXRSClientFactory.create("http://localhost:8000/CXFWebService/rest", RESTSample.class);<!--CRLF--><!--CRLF-->
// 从Spring Ioc容器中拿webClient对象<!--CRLF-->
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");<!--CRLF-->
RESTSample sample = ctx.getBean("restSampleBean", RESTSample.class);<!--CRLF--><!--CRLF-->
System.out.println(sample);<!--CRLF--><!--CRLF-->
System.out.println(sample.doGet());<!--CRLF-->
//System.out.println(sample.doRequest("haha", null, null));<!--CRLF-->
System.out.println(sample.getBean(22));<!--CRLF-->
System.out.println(sample.getList());<!--CRLF-->
System.out.println(sample.getMap().getMap());<!--CRLF-->
User user = new User();<!--CRLF-->
user.setId(21432134);<!--CRLF-->
user.setAddress("hoojo#gz");<!--CRLF-->
user.setEmail("[email protected]");<!--CRLF-->
user.setName("hoojo");<!--CRLF-->
System.out.println(sample.postData(user));<!--CRLF-->
System.out.println(sample.putData(111, user));<!--CRLF-->
sample.deleteData(2);<!--CRLF-->
这种方式相对比WebClient要简单,直接使用接口中的方法即可。同样如果你要整合到Spring可以在applicationContext-client.xml中增加配置如下:
<bean id="restSampleBean" class="org.apache.cxf.jaxrs.client.JAXRSClientFactory" factory-method="create"><!--CRLF-->
<constructor-arg type="java.lang.String" value="http://localhost:8000/CXFWebService/rest/" /><!--CRLF-->
<constructor-arg type="java.lang.Class" value="com.hoo.service.RESTSample" /><!--CRLF-->
</bean><!--CRLF-->
执行以上方法可以看到控制台打印结果如下:
client console<!--CRLF-->
org.apache.cxf.jaxrs.client.ClientProxyImpl@1cf7491<!--CRLF-->
this is get rest request<!--CRLF-->
22#JojO#null#null<!--CRLF-->
com.hoo.entity.Users@16eb6bc<!--CRLF-->
{key-0=0#JojO-0#null#null, key-1=1#JojO-1#null#null, key-2=2#JojO-2#null#null, key-3=3#JojO-3#null#null}<!--CRLF-->
21432134#jojo##12321321#[email protected]#hoojo#gz<!--CRLF-->
111#hoojo#[email protected]#hoojo#gz<!--CRLF--><!--CRLF-->
server console<!--CRLF-->
####getBean#####<!--CRLF-->
id:22<!--CRLF-->
Method:GET<!--CRLF-->
uri:sample/bean/22<!--CRLF-->
{id=[22]}<!--CRLF-->
####getList#####<!--CRLF-->
Method:GET<!--CRLF-->
uri:sample/list<!--CRLF-->
{}<!--CRLF-->
####getMap#####<!--CRLF-->
Method:GET<!--CRLF-->
uri:sample/map<!--CRLF-->
{}<!--CRLF-->
21432134#hoojo#[email protected]#hoojo#gz<!--CRLF-->
#####putData#####<!--CRLF-->
21432134#hoojo#[email protected]#hoojo#gz<!--CRLF-->
111#hoojo#[email protected]#hoojo#gz<!--CRLF-->
#######deleteData#######2<!--CRLF-->
就这样,整合restful WebService成功。