- 浏览: 704393 次
- 性别:
- 来自: 北京
博客专栏
-
读金庸故事,品程序人生
浏览量:47751
文章分类
最新评论
-
hty881008:
LZ,你的json返回是怎么出来的,我的怎么是No messa ...
使用CXF暴露您的REST服务 -
jxFY:
赞
Apache的对象池化工具commons-pool -
wangyudong:
新版本的Wisdom RESTClient地址https:// ...
使用CXF暴露您的REST服务 -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
使用CXF暴露您的REST服务 -
spring_springdata:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Maven3实战笔记01环境配置与使用入门
1. 前言
现在互联网Open API流行,将您的Web应用也可以开放Open API给其他第三方使用。达到一种资源有效利用的目的。而Open API的暴露方式是多种多样的。有Web Service形式的,也有提供一个URI方式的,还有就是给客户端一个jar包,直接使用即可。个人认为,对于使用者来说,使用最简单的就是一个“jar包”+“一份使用文档了”,jar将具体的远程通讯细节、鉴权、握手、数据格式转换等等全部都屏蔽掉。不过这个方式仅仅针对于Java应用,如果用于其他技术,例如ASP.NET、PHP的客户端就不合适了。那么折中一下还是提供一个URI资源,客户端无论是什么技术,只要调用此URI资源就可以获取感兴趣的数据,数据格式和技术平台无关(比如JSON、XML)。REST是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。Web应用暴露出来的是URI资源,客户端可以对资源进行操作(CRUD),REST最重要一点就是无状态,这点实际上感觉是特地针对EJB的会话Bean的重量级说的。所以REST轻量得很,轻量就意味着事务性、稳定性、安全性并没有传统JavaEE应用要求得那么高。主要集中于互联网应用对于不同终端的接口。具体的Rest介绍可以参考:
http://baike.baidu.com/view/1077487.htm。
Apache的CXF不仅可以将您的Web系统暴露成为Web Service,还可以将您的应用暴露成REST资源供不同客户端调用。
2. 环境搭建
先从Apache站点下载CXF相关jar包。网址是:http://cxf.apache.org/download.html。
我下载的是apache-cxf-2.3.2,这个版本算是比较老了,能用就行。
下载后将项目lib下面的jar拷贝到自己web项目的lib中。CXF的samples下面有很多例子,都是支持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的beans声明,需要支持jaxrs:server标签,还有一个就是需要引入CXF自己的一些Spring配置项。该配置项全部在cxf-2.3.2.jar下面的META-INF下面。最后就是注意要暴露的Service类需要配置在jaxrs:server标签中,这样REST资源才能生效。我们就看一个服务吧,在看之前先说明一点,代码有问题,先这么写,根据爆出的问题,咱们再修改代码。 先建立值对象
<?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>
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()返回的是Map,ok,比较简单的办法就是再写一个复合值对象。具体可参考
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
评论
https://github.com/Wisdom-Projects/rest-client
之前习惯用一款名字为 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
发表评论
-
Web前端优化
2014-04-08 09:35 3695Web前端优化总结 刘岩 suhua ... -
Maven3实战笔记12Maven构建Web应用
2011-06-14 09:20 32851. 构建Web应用介绍 Jav ... -
JavaEE5实战笔记04JSF的一些补充
2011-05-31 09:39 13021. 前言 这个是对于以前JSF学习的一点点补充 ... -
JSF与Struts2的瑜亮之争
2011-05-12 15:36 9796刘岩 Email:suhuanzheng778487 ... -
JavaEE5学习笔记14-JSF集成Facelets使用经验总结
2011-03-24 12:06 31561. Facelets就像tiles、siteme ... -
JavaEE5学习笔记13-JSF集成AJAX使用经验总结
2011-03-24 11:36 5397JSF也支持AJAX,ajax4jsf是专门为JSF提供的AJ ... -
JavaEE5学习笔记07-Web层与EJB集成总结(5):异常问题以及解决
2011-02-23 17:00 3497在Web系统和EJB整合的过程中,比较麻烦的经历就是打包、部署 ... -
JavaEE5学习笔记07-Web层与EJB集成总结(4):Struts2与EJB集成
2011-02-23 16:56 1475Struts2+EJB+JBoss的集成Demo 因为St ... -
JavaEE5学习笔记07-Web层与EJB集成总结(3):JSF与EJB集成
2011-02-23 16:55 1436JSF+EJB+JBoss集成Demo 上面提到过JSF也 ... -
JavaEE5学习笔记07-Web层与EJB集成总结(2):servlet与EJB集成结果展示
2011-02-23 16:51 1268之后在写2个jsp页面 insertUserFormServ ... -
JavaEE5学习笔记07-Web层与EJB集成总结(1):servlet与EJB集成
2011-02-23 16:48 17741. 集成时的感受 单丝不成线,孤木不成林。尽管 ... -
Struts2+Web常使用的功能经验笔记第1季--4
2011-01-21 10:15 12911. <meta http-equiv ... -
Struts2+Web常使用的功能经验笔记第1季--3
2011-01-21 10:14 14331. Struts2的拦截器 它一般作为S ... -
Struts2+Web常使用的功能经验笔记第1季--2
2011-01-21 10:13 14211. Struts2的JSON插件,让Str ... -
Struts2+Web常使用的功能经验笔记第1季--1
2011-01-21 10:11 23581. 前言 Apache的Struts2已经 ... -
JSF+Spring+JPA(Hibernate实现)的环境搭建(4)
2010-12-30 15:13 2082配置Spring文件applicationContext.xm ... -
修改fck源代码(2)
2010-12-30 14:35 1168showImage.jsp代码如下: <% ... -
修改fck源代码(1)
2010-12-30 14:33 1568OK,到此为止,FCK基本集成到您的web系统当中。但是目前出 ... -
FCKEditor使用、修改源代码经验总结
2010-12-30 14:23 3679FCKEditor使用、修改源代码经验总结 作者:刘岩 E ...
相关推荐
CXF同样支持REST服务的开发,你可以使用JAX-RS(Java API for RESTful Web Services)规范来实现。例如,通过使用@Path、@GET、@POST等注解,你可以指定资源路径、HTTP方法以及处理这些请求的方法。 为了将CXF与...
4. **配置CXF**:在Spring或CXF的配置文件中,配置服务端点和拦截器等,使得CXF能够正确地暴露和处理REST服务。 5. **启动和测试服务**:运行应用,通过浏览器或curl命令等工具访问REST服务,验证其功能是否正常。 ...
5. **设置CXF beans**:在Spring配置文件中,创建CXF beans来暴露我们的REST服务。这可以通过`JaxWsServerFactoryBean`或`JaxRsServerFactoryBean`完成,具体取决于是否需要SOAP支持。 6. **测试和调试**:使用`...
本教程将带你深入理解如何使用Apache CXF开发Web服务。 ### Web服务的基础知识 1. **SOAP(Simple Object Access Protocol)**:一种基于XML的协议,用于在Web上传输数据。SOAP消息通常包含一个头、一个体和可选的...
骆驼CXFRS WAR项目 该项目包括一个作为 WAR 的示例路由。 您可以通过运行来构建 WAR mvn install 然后,您可以通过将 WAR 放入您喜欢的 Web 容器中来运行该项目,或者直接运行 mvn jetty:run 启动并部署到 Jetty...
Apache CXF是一个开源服务框架,它允许开发人员创建和消费Web服务,而Spring框架则是一个广泛使用的Java企业级应用的IOC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。将两者结合,可以方便地...
**标题解析:** "CXF RESTful spring maven CRUD" 这个标题表明这是一个使用CXF框架、Spring和Maven构建的RESTful Web服务的示例项目,它实现了CRUD(创建、读取、更新、删除)操作。CXF是一个开源的服务框架,它...
4. 启动服务:部署应用,CXF会自动暴露SOAP Web服务。 接下来,我们讨论RESTful风格的Web服务。REST是一种轻量级的架构风格,它利用HTTP协议的基本操作(GET、POST、PUT、DELETE等)来操作资源。在CXF中实现RESTful...
然后,利用CXF的工具或注解,将这个接口暴露为Web服务。例如,可能有一个名为`getWeatherByCity`的方法,接收城市名作为参数,并返回相应的天气预报数据。 接下来,压缩包中的`webTest`可能包含以下组件: 1. **源...
- 配置CXF:使用CXF提供的注解或XML配置文件,将服务接口暴露为SOAP或REST服务。 - 启动服务:最后,通过CXF的Servlet部署到应用服务器上,如Tomcat或Jetty。 3. **客户端demo** CXF客户端用于调用服务器端的...
"caili-cxf-demo", "cxf-file-block", "cxf_demo", "CXFWEBService纯web版(未整合Spring版)", "CXFDemo"等可能是各种CXF使用示例,涵盖了基础的CXF服务发布、调用,以及一些特定场景的应用,如文件传输、分块上传...
总结,不依赖Spring,单纯使用CXF实现RESTful服务,主要是通过定义接口,实现服务逻辑,然后配置CXF服务器来部署和暴露服务。这种方式对于小型项目或学习RESTful服务的原理非常实用,但大型项目中,Spring等框架提供...
这个"webservice_cxf Demo"项目是一个基于 Apache CXF 的 Web 服务示例,旨在帮助开发者理解如何使用 CXF 来创建、部署和消费 Web 服务。在这个示例中,我们将探讨 CXF 的核心概念、工作流程以及如何通过它来实现...
2. **Service**:服务是CXF中的高层次抽象,它代表了一个业务逻辑的集合,可以被不同的协议(如SOAP或REST)暴露和消费。 3. **Endpoint**:端点是服务的具体实例,它知道如何处理特定的地址和消息格式。端点包含了...
Spring框架提供了强大的依赖注入和管理服务的能力,而CXF则负责处理Web服务的创建和暴露。整合两者,我们可以利用Spring配置来创建和管理CXF服务,使服务的生命周期与Spring容器同步,这样便于测试和维护。 1. **...
4. **CXF与REST**:CXF同样支持RESTful Web服务,你可以使用`@Path`、`@GET`、`@POST`等JAX-RS(Java API for RESTful Web Services)注解来创建REST服务。 5. **源码分析**:压缩包中的"CXF源码"可能包含了示例...
在服务端,CXF可以将Java对象直接暴露为Web服务,而在客户端,它可以生成Java客户端代理类来调用远程服务。 1. **SOAP服务**:CXF支持SOAP 1.1和1.2,可以使用JAX-WS(Java API for XML Web Services)规范来创建...
【CXF_Spring】是一个基于Spring框架的Apache CXF服务集成教程,主要涵盖了如何在Spring环境中配置和使用CXF来创建和消费Web服务。Apache CXF是一个开源的Java框架,它允许开发者创建和消费各种Web服务,包括SOAP和...
最后,使用CXF的Server类启动服务,将接口暴露为SOAP或REST服务。 客户端(webServicecxfClient): 客户端用于调用服务端提供的Web服务。在CXF中,客户端可以通过WSDL(Web服务描述语言)文件生成服务代理,这个...