`
anson_xu
  • 浏览: 513230 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

CXF 与 Android

阅读更多

在前面的随笔中,我讲了我的网站架构,这样的架构决定了我的网站中必须得用到WebService。比如,在用户注册的时候,用户数据主要是保存在内容服务器中,但是同时也要将部分数据提交到索引服务器中,这时,就可以让内容服务器访问索引服务器提供的WebService来提交数据;还可以让内容服务器通过定时任务,访问索引服务器的WebService来提交统计数据。

  我的网站使用SpringSide 2.0开发,在SpringSide 2.0中,默认使用的是XFire来提供WebService,但是我按照文档进行操作,结果却失败了。于是我向江南白衣请教,白衣推荐我使用CXF的最新版本,于是我到官方网站下载了CXF的最新版,按照示例来了一遍,很快就成功了。由此可见,使用CXF不仅简单,而且成功率高。因此,我在这里把我的经验和大家分享。

  第一步,下载CXF的最新版本,下载地址如下图:

 

 第二步,将CXF中的lib文件夹中的下列jar文件拷贝到我们项目的webapp/WEB-INF/lib目录下:

commons-logging-1.1.jar
geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)
geronimo-annotation_1.0_spec-1.1.jar (JSR 250)
geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)
geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)
geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)
jaxb-api-2.0.jar
jaxb-impl-2.0.5.jar
jaxws-api-2.0.jar
neethi-2.0.jar
saaj-api-1.3.jar
saaj-impl-1.3.jar
stax-api-1.0.1.jar
wsdl4j-1.6.1.jar
wstx-asl-3.2.1.jar
XmlSchema-1.2.jar
xml-resolver-1.2.jar
cxf-2.0-incubator.jar

 

这里有一些包我的项目中本身已经带有了,只不过CXF中提供的版本要更新一些。把这些包拷贝到项目中后,可以删除项目中的较低的版本,同时删除所有和XFire有关的包。当然,不删除也可以,因为我试过了,就算项目中存在多个不同版本的包,也不会发生冲突。

  当然,光拷贝这些包到项目中,还不能保证开发的顺利进行,还需要在Eclipse中设置项目的库,如下图:

在这里,我不得不说一下另外一个问题,那就是启动Tomcat服务器的时候,经常发生java.lang.OutOfMemoryError: PermGen space异常,出现这个异常是什么原因呢?在网上搜到的答案是这样的:PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

  本来,使用SpringSide 2.0就已经包含了许多的第三方包,容易出现这个问题,现在加入CXF依赖的这些包,就不可避免要出现这个问题了。这个问题的解决方法有两个,其一是不使用SUN的JDK。当然,我也懒得去下载一个别的JDK,因此就选择了第二个方法,那就是修改Tomcat的启动文件。

找到SpringSide2.0miscserverstomcat-5.5.17bin文件夹下的catalina.bat文件,使用记事本打开,找到如下行:

  set JAVA_OPTS=

  将这一行进行修改,加入启动参数,如下:

set JAVA_OPTS=%JAVA_OPTS% -Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=512m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%conflogging.properties":noJuli

  解决了以上这些问题,就可以正式使用CXF了。

  第三步,修改webapp/WEB-INF/web.xml文件,将以前的

<servlet>
 <servlet-name>xfire</servlet-name>
 <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>xfire</servlet-name>
 <url-pattern>/service/*</url-pattern>
</servlet-mapping>

修改为:

<servlet>
 <servlet-name>cxf</servlet-name>
 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>cxf</servlet-name>
 <url-pattern>/service/*</url-pattern>
</servlet-mapping>

  即可。

  第四步,定义一个提供WebService的接口。在我的项目中,我准备只提供一个WebService,即IndexService,这个服务中提供多个方法来分别满足索引服务器的各种功能。目前,我还只开发到了用户注册模块,需要向索引服务器提交用户数据,因此,暂时提供一个addUser方法作为示例,如下:

package com.yumdays.service;
import javax.jws.WebService;
import com.yumdays.model.SUser;
@WebService
public interface IndexService {
  public boolean addUser(SUser user,String adminName,String adminPassword);
}

 

SpringSide 2.0中使用CXF提供Web Service服务。

  而它的实现类如下:

package com.yumdays.service;
import com.yumdays.model.SUser;
import javax.jws.WebService;
@WebService(endpointInterface = "com.yumdays.service.IndexService")
public class IndexServiceImpl implements IndexService {
  public boolean addUser(SUser user, String adminName, String adminPassword) {
    // TODO 自动生成方法存根
    return false;
  }
}

  第五步,在项目的src/resource/spring目录下,删除所有和XFire有关的配置文件,添加一个cxf-beans.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:jaxws="http://cxf.apache.org/jaxws"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  <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 id="indexServiceBean" class="com.yumdays.service.IndexServiceImpl" />
  <jaxws:endpoint id="indexService" implementor="#indexServiceBean" address="/IndexService" />
</beans>

SpringSide 2.0中使用CXF提供Web Service服务。

  现在,重新构建项目,部署,启动Tomcat,就可以通过访问http://www.yumdays.com/service/IndexService?wsdl来测试该WebService是否成功被部署了。如下图:

http://www.yumdays.com/service/看全部wsdl

第六步,创建客户端,这一步非常的容易,只需要下面这样的配置:

<?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:jaxws="http://cxf.apache.org/jaxws"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  <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 id="client" class="com.yumdays.service.IndexService" factory-bean="clientFactory" factory-method="create"/>
  <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
   <property name="serviceClass" value="com.yumdays.service.IndexService"/>
   <property name="address" value="http://www.yumdays.com/service/IndexService"/>
  </bean>
</beans>

  就可以获得一个名称为client的bean,通过该bean,就可以非常方便的访问索引服务器提供的功能。

 

分享到:
评论
5 楼 liaozxbj 2011-09-08  
坑爹啊,和android一毛钱的关系都没有
4 楼 zhjxzhj 2011-08-23  
草  android在哪里
3 楼 xymeng0626 2011-08-15  
你大爷的,负责一点好不好,和android有什么关系
2 楼 limingnihao 2011-07-27  
与android有毛关系,有转载别人的嫌疑。
1 楼 ice.k 2011-02-25  
这和android有什么关系?

相关推荐

    android_ksoap2_cxf_wss4j_authentication

    本文将深入探讨如何使用Ksoap2在Android客户端实现与使用Apache CXF和WSS4J安全框架的Web服务的认证过程。 **Ksoap2库** Ksoap2是一个轻量级的开源库,专门用于Android平台,它允许Android应用通过HTTP/HTTPS协议...

    基于CXF的webService本地数据交互----PC端与Android端(一)

    本文将深入探讨基于Apache CXF实现的Web Service在本地数据交互中的应用,尤其是如何在PC端与Android端之间进行通信。Apache CXF是一个开源框架,专门用于构建和消费Web服务,支持多种协议和标准,如SOAP、RESTful等...

    android cxf

    android调用cxf服务器端和客户端完整代码,是在论坛上的demo,自己优化了一下,可以直接运行,自己研究了很长时间才弄出来,有了他会方便很多,和大家分享一下,运行项目之前请把服务器端的 address 和 android端的 ...

    基于CXF的webService本地数据交互----PC端与Android端(二)

    在本篇博文中,我们将深入探讨如何利用Apache CXF实现Web Service进行本地数据交互,特别是在PC端和Android端之间的通信。Apache CXF是一个开源框架,它允许开发人员创建和消费各种Web服务,包括SOAP和RESTful风格的...

    基于CXF的webService本地数据交互----PC端与Android端(三)

    在本篇博文中,我们将深入探讨如何利用Apache CXF库创建一个基于Web Service的数据交互解决方案,特别是关注于PC端和Android端之间的本地通信。Apache CXF是一个开源框架,它允许开发者构建和部署SOAP(简单对象访问...

    ssm+cxf(基于Maven开发的ssm框架集成cxf发布web service服务)

    作为一个刚学java,被抓壮丁的写服务器端的妹子,我只想说,画了我3周才解决了所有的错误啊,真的要自己因为不懂乱写乱改的时候遇到的那些莫名其妙的错误,因此对android客户端的好感上升了不止一个Level啊....

    rest风格webservice,服务端用的springmvc,客户端android,json传输,另附一个cxf的soap协议的wsdl服务端

    以前做java的初步理解了下android,为配合android实现所以实现了几个接口,此包是打包demo,包括3个项目,1个是安卓客户端,实现登录和手机归属地查询。实现了3个接口服务,1个接口服务端提供登录是用的传统...

    WebService+CXF+Spring+MySql+注解

    在本项目中,WebService被用作服务器与Android客户端之间的通信桥梁。 【CXF】:Apache CXF是一个开源的Java框架,主要用于构建和开发WebService。CXF支持多种协议和绑定,如SOAP、RESTful、XML/HTTP等,同时支持WS...

    cxf入门文档资料

    8. **集成与部署**:CXF可以与Spring框架紧密集成,方便在企业级应用中部署和管理服务。同时,它也支持多种容器如Tomcat、Jetty等。 9. **文件01_Java规范**:这可能是一个介绍Java编程规范的文档,对于理解CXF的...

    cxf_webservice入门

    在Android客户端中,理解如何与CXF Webservice交互是至关重要的,无论是通过SOAP还是RESTful方式,都需要熟悉HTTP协议和相关的XML/JSON格式。随着对CXF的深入学习,你将能够更好地构建可扩展、跨平台的分布式应用...

    解决CXF webService 调用报错 Cannot create a secure XMLInputFactory

    带详细解决方案说明文档,提供三种解决方式,另外包含stax2-api.jar,stax2-api-source.jar,woodstox-core-asl-4.4.1.jar,stax-ex.jar,wstx-asl-3.2.9.jar等jar文件,亲测有效。

    nmap-android, 在 Android Makefile/diff/scripts 上使用 Android NDK构建它,Nmap.zip

    nmap-android, 在 Android Makefile/diff/scripts 上使用 Android NDK构建它,Nmap nmapMakefile/diff/scripts 在 Android - 上使用 Android cxf构建它将 android/目录放置到iframe源 root 。转到android目录并说: ...

    Android与服务器端数据交互(基于SOAP协议整合android webservice)

    本文将详细介绍如何基于SOAP协议整合Android与Web服务,以便在Android客户端调用服务器提供的功能。SOAP(Simple Object Access Protocol)是一种轻量级的、基于XML的协议,用于在Web上交换结构化和类型化的信息。 ...

    Android与PC通信

    发现网上的很多例子都不能正常运行,...服务端用Cxf建立WebService,android客户端用ksoap2-android与服务端的webservice取得通信。本项目所有的jar包都已经打包,大家不用下载,仅仅要改的是IP,然后就可以直接运行了

    webservice+cxf+wss4j+spring

    在本示例中,我们关注的是一个基于Java的Web服务实现,它利用了Apache CXF、WSS4J和Spring框架。让我们深入探讨这些组件以及它们如何协同工作。 **Apache CXF** Apache CXF是一个开源的Web服务框架,它支持SOAP、...

    android用xfire操作sqlserver源完整代码+数据库脚本

    2. **Android与SQL Server通信的挑战** 在Android设备上直接连接远程SQL Server数据库通常不被推荐,因为这可能导致安全问题和性能瓶颈。但如果我们需要这样做,xfire可以作为中间层,通过在服务器端创建一个SOAP...

Global site tag (gtag.js) - Google Analytics