使用XFire开发Web Service客户端分为如下两大类:
一、服务提供者告诉你interface,你可以使用如下三种方式来开发:
YourService即是服务提供者告诉给你的一个interface(当然,也可以根据WSDL的定义,自己定义一个同样的interface)。
1,简单的方式
YourService service = (YourService)
new XFireProxyFactory().create(serviceModel, " http://your/remote/url " );
2,JSR 181注释的方式
YourService client = (YourService)
new XFireProxyFactory().create(serviceModel, " http://your/remote/url " );
3,混合方式
new AnnotationServiceFactory(
new Jsr181WebAnnotations(),
XFireFactory.newInstance().getXFire().getTransportManager(),
new AegisBindingProvider( new JaxbTypeRegistry())).create(YourService. class );
二,通过WSDL创建一个动态的客户端,如下:
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脚本如下:
< 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
调用方式如下:
String url = " http://localhost:8080/xfireTest/services/TestService " ;
String result = client.getAbcPort(url).sayHello( " Robin " );
2,使用命令生成客户端的命令如下:
: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
转自:http://www.blogjava.net/fastzch/archive/2008/08/28/225439.html
备注:
如果是采取传递对象的形式,则客户端用到的bean不仅内容要和服务器上的相同并且包名都必须是一样的!
常遇到的异常解决办法
1.java.io.FileNotFoundException: class path resource [org/codehaus/xfire/spring/xfire.xml] cannot be opened because it does not exist
没有找到org/codehaus/xfire/spring/xfire.xml。查看你的xfire所用的jar中是否包括了org/codehaus/xfire/spring/xfire.xml文件
2.java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/xfire-servlet.xml]
查看项目的webroot下面是否有/WEB-INF/xfire-servlet.xml文件
3.org.codehaus.xfire.XFireRuntimeException: Cannot create mapping for java.util.List, unspecified component type for return type of method findAllUser in interface com.devil13th.service.IUserService
发布的接口一定是有List或collection等返回类型,而且没有配置这些返回类型的.xml文件或是没有配置泛型的类型。查看【服务接口相关的xml】部分中的教程内容
plus:xfire client http authentic
Client basicAuth = ((XFireProxy) Proxy.getInvocationHandler(service))
.getClient();
basicAuth.setProperty(Channel.USERNAME, "user");
basicAuth.setProperty(Channel.PASSWORD, "pwd");