随笔-193  评论-715  文章-1  trackbacks-0
本Blog所有内容不得随意转载,版权属于作者所有。如需转载请与作者联系( fastzch@163.com )。
未经许可的转载,本人保留一切法律权益。
一直以来,发现有某些人完全不尊重我的劳动成果,随意转载,提醒一下那些人小心哪天惹上官司。

虽然XFire现在已经被CXF取代,但在现在已经开发的项目中,还是有不少使用XFire来实现Web Service的。前段时间,我写的使用XFire开发Web Service服务端的文章《XFire完整入门教程》受到了大家的好评,给大家带来了方便,很是高兴。今天来谈谈用XFire开发客户端。

本文也将继续使用上一篇文章的服务端来做为服务端。使用XFire开发Web Service客户端分为如下两大类:
一、服务提供者告诉你interface,你可以使用如下三种方式来开发:
YourService即是服务提供者告诉给你的一个interface(当然,也可以根据WSDL的定义,自己定义一个同样的interface)。
1,简单的方式
Service serviceModel = new ObjectServiceFactory().create(YourService.class);
YourService service 
= (YourService)
    
new XFireProxyFactory().create(serviceModel, "http://your/remote/url");
2,JSR 181注释的方式
Service serviceModel = new AnnotationServiceFactory().create(YourService.class);
YourService client 
= (YourService)
    
new XFireProxyFactory().create(serviceModel, "http://your/remote/url");
3,混合方式
Service serviceModel =
  
new AnnotationServiceFactory(
   
new Jsr181WebAnnotations(),
   XFireFactory.newInstance().getXFire().getTransportManager(),
   
new AegisBindingProvider(new JaxbTypeRegistry())).create(YourService.class);

二,通过WSDL创建一个动态的客户端,如下:
package test;

import java.net.MalformedURLException;
import java.net.URL;

import org.codehaus.xfire.client.Client;

public class DynamicClientTest {
    
public static void main(String[] args) throws MalformedURLException,
            Exception 
{
        Client client 
= new Client(new URL(
                
"http://localhost:8080/xfiretest/services/TestService?wsdl"));
        Object[] results 
= client
                .invoke(
"sayHello"new Object[] "Firends" });
        System.out.println(results[
0]);

    }

}


三,使用ANT工具或命令行通过WSDL生成一个客户端:
1,使用ANT生成客户端,ANT脚本如下:
<?xml version="1.0"?>
<project name="wsgen" default="wsgen" basedir=".">
    
<path id="classpathId">
        
<fileset dir="./WebRoot/WEB-INF/lib">
            
<include name="*.jar" />
        
</fileset>
    
</path>
    
<taskdef classpathref="classpathId" name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask">
    
</taskdef>
    
<target name="wsgen" description="generate client">
        
<wsgen outputDirectory="./src/" wsdl="abc.wsdl" binding="xmlbeans" package="com.abc.p" overwrite="true" />
    
</target>
</project>
请注意,脚本中有一个参数binding,可以指定如下两种不同的方式:
(1)jaxb(Java Architecture for XML Binding,https://jaxb.dev.java.net/):使用此种方式时,会自动生成更多的Request和Resopnse类。
(2)xmlbeans
调用方式如下:
AbcServiceClient client = new AbcServiceClient();
String url 
= "http://localhost:8080/xfireTest/services/TestService";
String result 
= client.getAbcPort(url).sayHello("Robin");

2,使用命令生成客户端的命令如下:
gpath=xfire-all-1.2-SNAPSHOT.jar:ant-1.6.5.jar:jaxb-api-2.0EA3.jar:stax-api-1.0.1.jar:jdom-1.0.jar:jaxb-impl-2.0EA3.jar\
:jaxb
-xjc-2.0-ea3.jar:wstx-asl-2.9.3.jar:commons-logging-1.0.4.jar:activation-1.1.jar:wsdl4j-1.5.2.jar:XmlSchema-1.0.3.jar:xfire-jsr181-api-1.0-M1.jar;

java 
-cp $gpath org.codehaus.xfire.gen.WsGen -wsdl http://localhost:8080/xfire/services/Bookservice?wsdl -o . -p pl.tomeks.client -overwrite true

其结果与ANT生成的一样。


四,参考资源:
1,XFire 1.2.6手册(http://xfire.codehaus.org/User%27s+Guide)
2,http://xfire.codehaus.org/Client+API
3,http://xfire.codehaus.org/Dynamic+Client

posted on 2008-08-28 23:26 Robin's Programming World 阅读(52269) 评论(33)  编辑  收藏 所属分类: Java

评论:
# re: 使用XFire开发Web Service客户端完整入门教程 2008-08-28 23:39 | softwave
确实,很多随意转载的非常可恶,连原始链接和出处都不标明  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2008-08-29 00:03 | Robin's Java World
@softwave
是呀,有些人太讨厌了。  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程[未登录] 2008-08-29 00:33 | 无名
# re: 使用XFire开发Web Service客户端完整入门教程 2008-08-29 09:40 | Robin's Java World
@无名
刚刚看了,那篇文章主要是讲服务端开发的,对于客户端的开发,我这里应该是最完整的。  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2008-10-21 17:00 | toby
问一下,如果是通过WSDL创建一个动态的客户端,参数是自定义的java对象如何传递:
client.invoke("sayHello", new Object[] { 自定义类型 });
吗?
我经过测试好像不行,运行时报空指针异常。
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程[未登录] 2008-12-18 10:29 | tracy
请教个问题阿,ant 生成客户端需要哪些包呢, 老是不停的报java.lang.NoClassDefFoundError

我声称时报错:
Buildfile: build.xml
wsgen:

BUILD FAILED
build.xml:52: java.lang.NoClassDefFoundError

Total time: 725 milliseconds  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2008-12-26 20:45 | Yvon
正好在找这方面的资料,谢谢啦  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2009-05-05 16:40 | @@@
Object[] results = client
.invoke("sayHello", new Object[] { "Firends" });
请问这是调用sayHello 的它的参数是string
那choose,test怎么调用
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2009-05-15 10:47 | jsp51.zhou
请问,能不能异步调用啊。  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2009-05-20 12:20 | 软件代理服务
你写错了,少写了一句代码,你并没有创建服务代理,你是这样写的:Service serviceModel = new ObjectServiceFactory().create(YourService.class);
YourService service = (YourService)
new XFireProxyFactory().create(serviceModel, "http://your/remote/url");
事实上,你实例话了一个新的XFireProxyFactory ,而这个没有含义的
应该这样写:
serviceModel = new ObjectServiceFactory().create(YourService.class);
XFire xFire = XFireFactory.newInstance().getXFire();
XFireProxyFactory factory = new XFireProxyFactory(xFire);
YourService service = factory .create(serviceModel, "http://your/remote/url");
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2009-05-25 10:48 | rubby
我感觉在中国 web service 应用很广泛,但大家都知道皮毛而已。
谁能够讲清楚Axis Axis2 xfire,CFX,
比较java和.net创建和调用web service?
讲述web service 的发展历史?

我就非常感谢。网上的都大同小异。这篇不错。  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2009-06-22 10:06 | isly
请问,我用动态生成客户端的方式,在main函数中运行ok,但是通过tomcat访问为什么报javax.servlet.ServletException: javax/wsdl/factory/WSDLFactory
异常呢,而且我试过把项目中的包拷到tomcat下还是一样。  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2009-08-14 15:22 | jiangli19192
package test;

import java.net.MalformedURLException;
import java.net.URL;

import org.codehaus.xfire.client.Client;

public class DynamicClientTest {
public static void main(String[] args) throws MalformedURLException,
Exception {
Client client = new Client(new URL(
"http://localhost:8080/xfiretest/services/TestService?wsdl"));
Object[] results = client
.invoke("sayHello", new Object[] { "Firends" });
System.out.println(results[0]);

}
}

运行的之后抛出:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/wsdl/factory/WSDLFactory
at org.codehaus.xfire.client.Client.<init>(Client.java:235)
at org.codehaus.xfire.client.Client.<init>(Client.java:246)
at com.centfor.zmd.Test.main(Test.java:32)
Caused by: java.lang.ClassNotFoundException: javax.wsdl.factory.WSDLFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 3 more  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程[未登录] 2009-08-18 01:11 | jeff
就这些东西还当个屁似的,本来就是拾人老外牙慧,还牛逼哄哄的。真是无语!  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程[未登录] 2010-02-05 12:32 | mask
请教楼主一个问题,我现在建立客户端使用的下面这种方式:
package test;

import java.net.MalformedURLException;
import java.net.URL;

import org.codehaus.xfire.client.Client;

public class DynamicClientTest {
public static void main(String[] args) throws MalformedURLException,
Exception {
Client client = new Client(new URL(
"http://localhost:8080/xfiretest/services/TestService?wsdl"));
Object[] results = client
.invoke("sayHello", new Object[] { "Firends" });
System.out.println(results[0]);

}
}
我现在的客户端是建立在EJB应用上的,建立完以后,运行该类没有问题,可以正确输出结果,但是当我把main方法改成我的一个返回webservice结果的普通方法,在EJB的会话BEAN里调用的时候就是出一个很奇怪的异常:
Caused by: java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:468)
at java.lang.Integer.parseInt(Integer.java:497)
at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.createClient(CommonsHttpMessageSender.java:276)
at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.open(CommonsHttpMessageSender.java:129)
at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:121)
at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
请问楼主遇到过这样的问题吗?期待楼主的回复  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2010-02-08 15:28 | nick.xiao
写的很详细,thanks  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2010-03-26 17:25 | swarding99
写的很好,很详细。多谢  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程[未登录] 2010-04-26 17:28 | Jack
@softwave
转载确实可恶,但部分还是喜欢文章而黏贴到自己博客以供查阅。
以文章盈利或者打造博客排行为目的的,少  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2010-11-09 10:00 | 雨风
借用一下楼上朋友的代码,我也出现了同样的问题,请教楼主该怎么解决?

package test;

import java.net.MalformedURLException;
import java.net.URL;

import org.codehaus.xfire.client.Client;

public class DynamicClientTest {
public static void main(String[] args) throws MalformedURLException,
Exception {
Client client = new Client(new URL(
"http://localhost:8080/xfiretest/services/TestService?wsdl"));
Object[] results = client
.invoke("sayHello", new Object[] { "Firends" });
System.out.println(results[0]);

}
}

运行的之后抛出:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/wsdl/factory/WSDLFactory
at org.codehaus.xfire.client.Client.<init>(Client.java:235)
at org.codehaus.xfire.client.Client.<init>(Client.java:246)
at com.centfor.zmd.Test.main(Test.java:32)
Caused by: java.lang.ClassNotFoundException: javax.wsdl.factory.WSDLFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 3 more  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2010-11-12 09:35 | Robin's Java World
@雨风
很明显,差一些lib,请下载并放到lib目录中。  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2011-07-12 18:21 | 剑天
@toby
你那种方法只是调用普通的webservice,对于一些复杂类型的处理,是处理不了的,这篇文章是讲如何处理复杂类型的,我建议你去学学cxf框架吧,你会知道java开发webservice有多么的神奇,在回来看看这个原始的,cxf是起源于xfire,  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2011-09-07 11:06 | xufeng52645264
我的解决了,需要在工程中添加xfire相关的库,工程右键-构建路径-配置构建路径-库-添加库-MyEclipseLibrary-选中Xfire1.2 Core Libraries、HTTP Client~、JAXB2 ~三个-确定,OK!@isly
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程[未登录] 2011-09-30 16:15 | song
您好,
遇到的问题:我现在需要调用别人发布的webservice;他们提供了webservice的接口地址和方法名称及参数,返回值
现在想要使用xfire实现访问,大概应该做哪些步骤...
谢谢.
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2011-11-22 10:59 | CriusGong
Hi Robin!
谢谢你的文章,对我们这些初学者受益匪浅。现我碰到一下问题,这个问题应该很简单,但是我不清楚这个url的运行,可以给点指点吗?
- Server returned error code = 404 for URI : http://localhost:8001/Studey_pjt/services/HelloService. Check server logs for details

  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2012-07-08 01:52 | 567
567  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2013-01-29 16:08 | chengxx
您好,我这也是报空指针异常,您解决了吗?athena2007@126.com能发邮件给我吗,非常感谢@toby
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2013-02-01 17:00 | yumaoer
AbcServiceClient client = new AbcServiceClient();
String url = "http://localhost:8080/xfireTest/services/TestService";
String result = client.getAbcPort(url).sayHello("Robin");
新手请教:AbcServiceClient 这个类和 getAbcPort这个方法是怎么来的啊?
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2013-02-28 08:37 | a3
@jeff
你屁真多  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程[未登录] 2013-05-25 19:55 | wang
外部包不全@jiangli19192
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2013-06-07 17:20 | promise
invoke里面的蚕食都是啥意思@mask
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2014-05-04 18:08 | kunlun122
@promise
org.codehaus.xfire.fault.XFireFault: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.NullReferenceException: Object reference not set to an instance of an object.
我用动态客户端调用c#写的webservice,报上面这个错误  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程 2014-05-04 18:09 | kunlun122
@kunlun122
这个webservice有soap1.1,也有soap1.2,我想问xfire用的是哪个标准?
  回复  更多评论
  
# re: 使用XFire开发Web Service客户端完整入门教程[未登录] 2014-06-04 20:18 | ANDY
你好啊。我用的是动态创建的方法啊,但是为什么断点到服务端,字符串参数都是空的呢??请指教下。。。。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: