Apache CXF以前一般用来开发基于SOAP协议的Web Service,其实CXF也实现了JAX-RS(JSR311)接口,这里我们用它实现REST API。
1.spring web基础环境
见之前章节创建的web工程testRest。
2.REST地址
与上一节类似,设计RESTEasy模块/restCxf/*。
3.RESTEasy库
在项目pom.xml中加入RESTEasy依赖:
<properties>
<restCxf.version>3.1.0</restCxf.version>
</properties>
<dependencies>
...
<!-- restCxf begin -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${restCxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${restCxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${restCxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>${restCxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>${restCxf.version}</version>
</dependency>
<!-- restCxf end -->
...
加入cxf jaxrs库、http库和client库。
4.Servlet
配置RESTEasy访问入口。
<!-- restCxf -->
<servlet>
<servlet-name>restCxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>restCxf</servlet-name>
<url-pattern>/restCxf/*</url-pattern>
</servlet-mapping>
restCxfServlet将拦截/restCxf/*下的所有访问。
5.实现api
新建com.sunbin.test.restCxf包,新增TeachersResource类,以实现/teachers路径的接口:
package com.sunbin.test.restCxf;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.sunbin.test.teacher.pojo.Teacher;
import com.sunbin.test.teacher.service.TeacherService;
@Component
@Path("teachers")
@Produces(MediaType.APPLICATION_JSON)
public class TeachersResource {
@Autowired
private TeacherService teacherService;
@GET
public Map get(@Context HttpServletRequest arg0) {
System.out.println("RestCxf TeachersResource.get:"
+ arg0.getSession().getId());
Map map = new HashMap();
map.put("teachers", teacherService.list());
return map;
}
@POST
public Map post(@FormParam("age") int age,@FormParam("name") String name){
Map map = new HashMap();
try {
Teacher teacher = new Teacher();
teacher.setName(name);
teacher.setAge(age);
System.out.println("RestCxf TeachersResource.post:"+teacher);
teacherService.save(teacher);
map.put("status", "y");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return map;
}
}
路径注解@Path、返回类型注解@Produces、访问方法@GET、参数读取@FormParam,都和Jersey的JAX-RS相同。
新增TeacherResource类,以实现/teacher/{id}路径的接口:
package com.sunbin.test.restCxf;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.sunbin.test.teacher.pojo.Teacher;
import com.sunbin.test.teacher.service.TeacherService;
@Component
@Path("teacher/{id}")
@Produces(MediaType.APPLICATION_JSON)
public class TeacherResource {
@Autowired
private TeacherService teacherService;
@GET
public Map get(@PathParam("id") int id) {
System.out.println("RestCxf TeacherResource.get:"+id);
Teacher teacher = new Teacher();
teacher.setId(id);
Map map = new HashMap();
map.put("teacher", teacherService.get(teacher));
return map;
}
@PUT
public Map put(@PathParam("id") int id,@FormParam("age") int age,@FormParam("name") String name){
Map map = new HashMap();
try {
Teacher teacher = new Teacher();
teacher.setId(id);
teacher.setName(name);
teacher.setAge(age);
System.out.println("RestCxf TeacherResource.put:"+id+":"+teacher);
teacherService.update(teacher);
map.put("status", "y");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return map;
}
@DELETE
public Map delete(@PathParam("id") int id){
Map map = new HashMap();
try {
System.out.println("RestCxf TeacherResource.delete:"+id);
Teacher teacher = new Teacher();
teacher.setId(id);
teacherService.remove(teacher);
map.put("status", "y");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return map;
}
}
6.js测试
使用上一节的测试页面src\main\webapp\rest\index.jsp进行测试:
...
<script type="text/javascript">
// 测试框架
//var restType = "jersey";
//var restType = "restlet";
//var restType = "resteasy";
var restType = "restCxf";
//var restType = "restMvc";
...
重新部署后,使用浏览器访问
http://localhost:8080/testRest/rest,测试内容和Restlet测试相同。
7.CXF Client测试
CXF提供rest Client库用于测试REST接口。
新建TestRestCxf类,代码如下:
package com.sunbin.test.restCxf;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Form;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.apache.cxf.jaxrs.client.WebClient;
public class TestRestCxf {
public static final String URL_BASE = "http://localhost:8080/testRest/restCxf/";
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "config/restCxf/restCxfClient.xml" });
WebClient teachersClient = (WebClient) context
.getBean("teachersClient");
WebClient teacherClient = ((WebClient) context.getBean("teacherClient"))
.path("{id}", "1");
String module = "teacher";
String url = "";
String result = "";
Entity<Form> entity = null;
Form form = null;
url = URL_BASE + module + "s";
System.out.println("get\t" + url);
result = teachersClient.get(String.class);
System.out.println(result);
url = URL_BASE + module + "s";
System.out.println("post\t " + url);
form = new Form().param("age", "1").param("name", "a");
entity = Entity.form(form);
result = teachersClient.post(entity, String.class);
System.out.println(result);
url = URL_BASE + module + "s";
System.out.println("get\t" + url);
result = teachersClient.get(String.class);
System.out.println(result);
url = URL_BASE + module + "/1";
System.out.println("get\t " + url);
result = teacherClient.get(String.class);
System.out.println(result);
url = URL_BASE + module + "/1";
System.out.println("put\t " + url);
form = new Form().param("age", "11").param("name", "aa");
entity = Entity.form(form);
result = teacherClient.put(entity, String.class);
System.out.println(result);
url = URL_BASE + module + "s";
System.out.println("get\t" + url);
result = teachersClient.get(String.class);
System.out.println(result);
url = URL_BASE + module + "/1";
System.out.println("delete\t " + url);
result = teacherClient.delete().readEntity(String.class);
System.out.println(result);
url = URL_BASE + module + "s";
System.out.println("get\t" + url);
result = teachersClient.get(String.class);
System.out.println(result);
}
}
测试结果与Restlet类似。
分享到:
相关推荐
2. **JAX-RS**: Java API for RESTful Web Services,是Java平台上的REST标准,CXF提供了对其的实现。相关的JAR包可能包括`javax.ws.rs-api-2.x.y.jar`和`cxf-rt-rs-service-description-3.x.y.jar`等。 3. **JAXB*...
【Spring CXF REST Demo】项目是一个使用Maven构建的Java应用程序,它展示了如何将Spring框架与Apache CXF集成,以创建RESTful风格的服务。在这个项目中,开发者可以学习到如何利用CXF作为服务端的REST服务提供者,...
在IT行业中,REST和SOAP是两种常见的Web服务接口设计风格,而CXF是一个流行的开源框架,用于构建和消费这两种服务。Maven是一个项目管理和综合工具,SpringMVC则是Spring框架的一部分,专门用于构建Web应用程序。...
对于REST服务,CXF提供了基于JAX-RS(Java API for RESTful Web Services)的实现,使得RESTful服务的开发更加直观和简洁。 **发布REST服务** 1. **环境准备**:首先,确保你已经下载了CXF 2.3.3的jar包,这些依赖...
当CXF与Spring结合时,可以创建高效且灵活的REST接口,便于开发分布式系统。本篇将详细介绍如何利用CXF和Spring进行REST接口的开发。 首先,我们需要在项目中引入CXF和Spring的相关依赖。在Maven工程中,可以在pom....
【标题】"java cxf规范rest"涉及到的是Java开发中使用Apache CXF框架实现RESTful服务的相关技术。CXF是一个开源的服务框架,它允许开发者创建和消费各种Web服务,包括基于JAX-WS和JAX-RS的标准。REST...
总之,这份"使用Spring整合CXF发布RESTFul项目案例"资料将帮助你深入理解RESTful服务的实现,以及如何利用Spring和CXF这一强大组合来构建高效、灵活的REST服务。通过实践案例,你可以亲手尝试并掌握相关技能。
在本文中,我们将探讨三种常用的技术:REST、Hessian和CXF,它们都可以用来实现Web服务,尤其是当我们使用Maven作为构建工具时。 首先,REST(Representational State Transfer,表述性状态转移)是一种基于HTTP...
CXF提供了强大的工具和API,简化了REST服务的实现过程。 二、CXF REST服务的创建 1. 定义资源类:创建Java类,定义服务接口,使用JAX-RS注解(如`@Path`,`@GET`,`@POST`等)来标识资源路径和操作。 2. 创建服务...
在IT行业中,Spring CXF是一个广泛使用的开源框架,它整合了Spring框架的功能和Apache CXF的服务堆栈,为开发人员提供了构建和实现Web服务的强大工具。在这个“Spring CXF Restful实例”中,我们将深入探讨如何利用...
【CXF实现Web服务详解】 Web服务是一种通过网络进行通信的软件系统,它允许不同的应用程序在不同的操作系统和编程语言之间交换数据。CXF(Apache CXF)是一个开源的Java框架,用于构建和部署Web服务。CXF支持多种...
- 在Spring配置中启用CXF的Bus,通过`<jaxrs:server>`标签定义REST服务的位置和实现。 2. **定义REST服务**: - 使用JAX-RS(Java API for RESTful Web Services)注解来声明REST资源。例如,用`@Path`定义URL...
【描述】:“CXF REST Web服务实现文件下载” 在CXF中实现RESTful Web服务进行文件下载,主要涉及到以下几个关键步骤: 1. **配置CXF**:首先,你需要在项目中引入Apache CXF的依赖库,并配置相关的服务端点...
#### 五、测试REST服务 完成上述步骤后,你可以通过浏览器访问`http://localhost:8080/yourproject/services/hello`来测试你的REST服务是否成功暴露。 #### 六、总结 通过本篇文章的学习,你应该已经了解了如何...
【标题】"CXF实现WebServices_4"深入解析 在IT行业中,Web Services是一种用于构建分布式系统的重要技术,它允许不同的应用程序通过网络进行通信。Apache CXF是Java平台上一个强大的开源框架,专门用于实现和消费...
本项目聚焦于利用CXF与Spring框架集成,实现RESTful风格的Web服务。REST(Representational State Transfer)是一种轻量级、基于HTTP协议的架构风格,适用于构建可伸缩的、高性能的Web应用。 首先,让我们深入理解...
CXF REST最简实例是一个快速入门的教程,它展示了如何使用Apache CXF框架创建RESTful Web服务并进行测试。Apache CXF是一个流行的开源框架,它允许开发者构建和消费Web服务,包括SOAP和REST风格的服务。REST...
本篇将详细讲解如何使用Apache CXF框架在同一系统中同时实现这两种类型的Web服务接口。 Apache CXF是一个流行的开源Java框架,用于构建和开发Web服务。它支持SOAP、RESTful等多种Web服务规范,使得开发者能够灵活地...
【标题】:“CXF实现WebService”是指使用Apache CXF框架来开发和实现Web服务的过程。Apache CXF是一个开源的Java框架,它允许开发者创建、部署和管理基于SOAP(Simple Object Access Protocol)和REST...
本项目“cxf+spring发布webservice和restservice”专注于利用Apache CXF框架与Spring框架结合,实现这两种服务的发布。Apache CXF是一个开源的、功能丰富的服务栈,它使得开发者能够轻松地构建和部署SOAP和RESTful ...