`
suhuanzheng7784877
  • 浏览: 704393 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47751
社区版块
存档分类
最新评论

使用CXF暴露您的REST服务

阅读更多

1.  前言

现在互联网Open API流行,将您的Web应用也可以开放Open API给其他第三方使用。达到一种资源有效利用的目的。而Open API的暴露方式是多种多样的。有Web Service形式的,也有提供一个URI方式的,还有就是给客户端一个jar包,直接使用即可。个人认为,对于使用者来说,使用最简单的就是一个“jar包”+“一份使用文档了”,jar将具体的远程通讯细节、鉴权、握手、数据格式转换等等全部都屏蔽掉。不过这个方式仅仅针对于Java应用,如果用于其他技术,例如ASP.NETPHP的客户端就不合适了。那么折中一下还是提供一个URI资源,客户端无论是什么技术,只要调用此URI资源就可以获取感兴趣的数据,数据格式和技术平台无关(比如JSONXML)。REST是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。Web应用暴露出来的是URI资源,客户端可以对资源进行操作(CRUD),REST最重要一点就是无状态,这点实际上感觉是特地针对EJB的会话Bean的重量级说的。所以REST轻量得很,轻量就意味着事务性、稳定性、安全性并没有传统JavaEE应用要求得那么高。主要集中于互联网应用对于不同终端的接口。具体的Rest介绍可以参考:

http://baike.baidu.com/view/1077487.htm

ApacheCXF不仅可以将您的Web系统暴露成为Web Service,还可以将您的应用暴露成REST资源供不同客户端调用。

2.  环境搭建

先从Apache站点下载CXF相关jar包。网址是:http://cxf.apache.org/download.html

我下载的是apache-cxf-2.3.2,这个版本算是比较老了,能用就行。

下载后将项目lib下面的jar拷贝到自己web项目的lib中。CXFsamples下面有很多例子,都是支持Ant构建和Maven构建的。建议还是先使用传统方式构建项目,之后再迁移为Maven项目。这样依赖哪些东西心理有数,CXF是强依赖于Spring框架的。

3.  暴露REST服务

下面我们开始暴露自己的Web资源成为REST服务。我们先来看看web.xml的内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
	<!-- 配置Spring的配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>WEB-INF/beans.xml</param-value>
	</context-param>
	
	<!-- 配置Spring的web Context监听器,将Spring与web工程集成在一起 -->
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
        </listener-class>
	</listener>
	
	<!-- 配置CXF -->
	<servlet>
		<servlet-name>CXFServlet</servlet-name>
		<display-name>CXF Servlet</display-name>
		<servlet-class>
			org.apache.cxf.transport.servlet.CXFServlet
        </servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>CXFServlet</servlet-name>
		<url-pattern>/service/*</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 bean.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"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation=" 
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd 
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- 引入CXF下面的配置文件 -->
	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<!-- 将Bean托管给Spring -->
	<bean id="roomService" class="com.platform.restful.demo.RoomService">
	</bean>

	<bean id="userService" class="com.platform.restful.demo.UserService">
	</bean>
	
	<!-- 配置需要暴露的BeanService -->
	<jaxrs:server id="restContainer" address="/">
		<jaxrs:serviceBeans>
			<ref bean="roomService" />
			<ref bean="userService" />
		</jaxrs:serviceBeans>
	</jaxrs:server>
</beans>

 此配置文件需要注意几点,一个就是xmlbeans声明,需要支持jaxrs:server标签,还有一个就是需要引入CXF自己的一些Spring配置项。该配置项全部在cxf-2.3.2.jar下面的META-INF下面。最后就是注意要暴露的Service类需要配置在jaxrs:server标签中,这样REST资源才能生效。我们就看一个服务吧,在看之前先说明一点,代码有问题,先这么写,根据爆出的问题,咱们再修改代码。

先建立值对象

package com.platform.restful.demo;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "UserVO")
public class UserVO {

	private int id;
	private String name;

//省去setter和getter
}

 下面是DAO

package com.platform.restful.demo;

import java.util.HashMap;
import java.util.Map;

public class UserDAO {
	
	private static Map<String, UserVO> userVOs;
	
	static {
		userVOs = new HashMap<String, UserVO>();
	
		UserVO u1=new UserVO();
		u1.setId(1);
		u1.setName("liuyan");
		
		UserVO u2=new UserVO();
		u2.setId(2);
		u2.setName("yexiaochai");
		
		userVOs.put("1", u1);
		userVOs.put("2", u2);
	}
	
	public static Map<String,UserVO> getPersons(){
		return userVOs;
	}
	
	public static UserVO getPerson(){
		return userVOs.get("1");
	}

}

 下面就是爆出来的门面服务类了

 

package com.platform.restful.demo;

import java.util.Map;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/userservice")
@Produces("application/json")
public class UserService {
	
	@GET
	@Path("/getUsers")
	@Consumes("application/xml")
	public Map<String, UserVO> getUsers() {
		System.out.println("get users ");
		Map<String, UserVO> userVOs = UserDAO.getPersons();
		return userVOs;
	}
	
	@GET
	@Path("/getUser")
	@Consumes("application/xml")
	public UserVO getUser() {
		System.out.println("get user ");
		UserVO userVO = UserDAO.getPerson();
		return userVO;
	}

}

 我们将项目部署到Tomcat上,打开浏览器,输入URL

http://127.0.0.1:8080/cxfdemo/service/userservice/getUser

则输出了一段Json信息

{"UserVO":{"id":1,"name":"liuyan"}}

 那我们输入URL

http://127.0.0.1:8080/cxfdemo/service/userservice/getUsers

会是什么效果呢,控制台报出如下错误

2011-6-15 13:52:47 org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage
警告: No message body writer has been found for response class HashMap.

 错误信息很明确了public Map<String, UserVO> getUsers()返回的是Mapok,比较简单的办法就是再写一个复合值对象。具体可参考

http://blog.sina.com.cn/s/blog_4051f5dc0100ju0a.html

复合对象

package com.platform.restful.demo;

import java.util.Map;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "UserVOMap")
public class UserVOMap {

	private Map<String, UserVO> userVOs;

	public Map<String, UserVO> getUserVOs() {
		return userVOs;
	}

	public void setUserVOs(Map<String, UserVO> userVOs) {
		this.userVOs = userVOs;
	}

}

 Service服务类修改如下

	@GET
	@Path("/getUsers")
	@Consumes("application/xml")
	public UserVOMap getUsers() {
		System.out.println("get users ");
		Map<String, UserVO> userVOs = UserDAO.getPersons();
		UserVOMap userVOMap = new UserVOMap();
		userVOMap.setUserVOs(userVOs);
		return userVOMap;
	}

 之后再次访问http://127.0.0.1:8080/cxfdemo/service/userservice/getUsers

获得Json数据如下

{"UserVOMap":{"userVOs":{"entry":[{"key":2,"value":{"id":2,"name":"yexiaochai"}},{"key":1,"value":{"id":1,"name":"liuyan"}}]}}}

 

   另外共享一篇8366的文章和demo

http://8366.iteye.com/blog/952887

12
0
分享到:
评论
5 楼 hty881008 2018-07-18  
LZ,你的json返回是怎么出来的,我的怎么是No message body writer has been found for response class UserVO.
4 楼 wangyudong 2018-03-12  
新版本的Wisdom RESTClient地址
https://github.com/Wisdom-Projects/rest-client
3 楼 wangyudong 2017-11-27  
由CXF实现的微服务需要有比较好的工具去测试RESTful API,很多REST Client是不支持自动化测试RESTful API,也不支持自动生成API文档.
之前习惯用一款名字为 WisdomTool REST Client,支持自动化测试RESTful API,输出精美的测试报告,并且自动生成精美的RESTful API文档。
轻量级的工具,功能却很精悍哦!

https://github.com/wisdomtool/rest-client

Most of REST Client tools do not support automated testing.

Once used a tool called WisdomTool REST Client supports automated testing, output exquisite report, and automatically generating RESTful API document.

Lightweight tool with very powerful features!

https://github.com/wisdomtool/rest-client
2 楼 zjc198805 2012-04-27  
LZ,如何上传文件呢?求指教!644952013@qq.com
1 楼 itcyt 2011-12-26  
这里怎么加入安全认证呢?

相关推荐

    cxf+spring发布webservice和restservice

    CXF同样支持REST服务的开发,你可以使用JAX-RS(Java API for RESTful Web Services)规范来实现。例如,通过使用@Path、@GET、@POST等注解,你可以指定资源路径、HTTP方法以及处理这些请求的方法。 为了将CXF与...

    使用CXF开发RESTFul服务

    4. **配置CXF**:在Spring或CXF的配置文件中,配置服务端点和拦截器等,使得CXF能够正确地暴露和处理REST服务。 5. **启动和测试服务**:运行应用,通过浏览器或curl命令等工具访问REST服务,验证其功能是否正常。 ...

    Spring CXF Restful 实例

    5. **设置CXF beans**:在Spring配置文件中,创建CXF beans来暴露我们的REST服务。这可以通过`JaxWsServerFactoryBean`或`JaxRsServerFactoryBean`完成,具体取决于是否需要SOAP支持。 6. **测试和调试**:使用`...

    实战Web Service —— 使用Apache CXF开发Web服务的教程

    本教程将带你深入理解如何使用Apache CXF开发Web服务。 ### Web服务的基础知识 1. **SOAP(Simple Object Access Protocol)**:一种基于XML的协议,用于在Web上传输数据。SOAP消息通常包含一个头、一个体和可选的...

    camel-rest-cxfrs

    骆驼CXFRS WAR项目 该项目包括一个作为 WAR 的示例路由。 您可以通过运行来构建 WAR mvn install 然后,您可以通过将 WAR 放入您喜欢的 Web 容器中来运行该项目,或者直接运行 mvn jetty:run 启动并部署到 Jetty...

    cxf+Spring2.5

    Apache CXF是一个开源服务框架,它允许开发人员创建和消费Web服务,而Spring框架则是一个广泛使用的Java企业级应用的IOC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。将两者结合,可以方便地...

    CXF RESTful spring maven CRUD

    **标题解析:** "CXF RESTful spring maven CRUD" 这个标题表明这是一个使用CXF框架、Spring和Maven构建的RESTful Web服务的示例项目,它实现了CRUD(创建、读取、更新、删除)操作。CXF是一个开源的服务框架,它...

    在同一个系统里用cxf 实现SOAP 协议和RESTful风格 两种类型的webservice接口

    4. 启动服务:部署应用,CXF会自动暴露SOAP Web服务。 接下来,我们讨论RESTful风格的Web服务。REST是一种轻量级的架构风格,它利用HTTP协议的基本操作(GET、POST、PUT、DELETE等)来操作资源。在CXF中实现RESTful...

    webservice天气预报例子cxf实例

    然后,利用CXF的工具或注解,将这个接口暴露为Web服务。例如,可能有一个名为`getWeatherByCity`的方法,接收城市名作为参数,并返回相应的天气预报数据。 接下来,压缩包中的`webTest`可能包含以下组件: 1. **源...

    webservice cxf 服务端客户端传递参数的例子demo

    - 配置CXF:使用CXF提供的注解或XML配置文件,将服务接口暴露为SOAP或REST服务。 - 启动服务:最后,通过CXF的Servlet部署到应用服务器上,如Tomcat或Jetty。 3. **客户端demo** CXF客户端用于调用服务器端的...

    CXF各种资料.rar

    "caili-cxf-demo", "cxf-file-block", "cxf_demo", "CXFWEBService纯web版(未整合Spring版)", "CXFDemo"等可能是各种CXF使用示例,涵盖了基础的CXF服务发布、调用,以及一些特定场景的应用,如文件传输、分块上传...

    cxf restful

    总结,不依赖Spring,单纯使用CXF实现RESTful服务,主要是通过定义接口,实现服务逻辑,然后配置CXF服务器来部署和暴露服务。这种方式对于小型项目或学习RESTful服务的原理非常实用,但大型项目中,Spring等框架提供...

    webservice_cxf Demo

    这个"webservice_cxf Demo"项目是一个基于 Apache CXF 的 Web 服务示例,旨在帮助开发者理解如何使用 CXF 来创建、部署和消费 Web 服务。在这个示例中,我们将探讨 CXF 的核心概念、工作流程以及如何通过它来实现...

    cxf-core-3.2.4_cxf_源码

    2. **Service**:服务是CXF中的高层次抽象,它代表了一个业务逻辑的集合,可以被不同的协议(如SOAP或REST)暴露和消费。 3. **Endpoint**:端点是服务的具体实例,它知道如何处理特定的地址和消息格式。端点包含了...

    cxf webservice restful实现

    Spring框架提供了强大的依赖注入和管理服务的能力,而CXF则负责处理Web服务的创建和暴露。整合两者,我们可以利用Spring配置来创建和管理CXF服务,使服务的生命周期与Spring容器同步,这样便于测试和维护。 1. **...

    java+Webservice开发(CXF)

    4. **CXF与REST**:CXF同样支持RESTful Web服务,你可以使用`@Path`、`@GET`、`@POST`等JAX-RS(Java API for RESTful Web Services)注解来创建REST服务。 5. **源码分析**:压缩包中的"CXF源码"可能包含了示例...

    Cxf2.1.3实例(全)

    在服务端,CXF可以将Java对象直接暴露为Web服务,而在客户端,它可以生成Java客户端代理类来调用远程服务。 1. **SOAP服务**:CXF支持SOAP 1.1和1.2,可以使用JAX-WS(Java API for XML Web Services)规范来创建...

    CXF_Spring

    【CXF_Spring】是一个基于Spring框架的Apache CXF服务集成教程,主要涵盖了如何在Spring环境中配置和使用CXF来创建和消费Web服务。Apache CXF是一个开源的Java框架,它允许开发者创建和消费各种Web服务,包括SOAP和...

    这是cxf的例子(代码)

    最后,使用CXF的Server类启动服务,将接口暴露为SOAP或REST服务。 客户端(webServicecxfClient): 客户端用于调用服务端提供的Web服务。在CXF中,客户端可以通过WSDL(Web服务描述语言)文件生成服务代理,这个...

Global site tag (gtag.js) - Google Analytics