xfire客户端调用net提供的xfire服务,参数是通过字符串调用函数二维数组,客户端是java,求可行的样例代码

根据默认配置实现代理客户端
根据JSR 181注解实现代理客户端
根据WSDL自动生成客户端代码
动态客户端的实现
[一]、概述
中发布的服务端为例,WSDL::8080/xfire-base-demo/services/HelloWorldService 。
创建一个客户端调用的工程:
mvn archetype:create -DgroupId=com.micmiu.xfire.demo -DartifactId=xfire-client-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn archetype:create -DgroupId=com.micmiu.xfire.demo -DartifactId=xfire-client-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
[二]、根据默认配置实现代理客户端
首先:编写一个像之前文章中服务端一样的服务接口类:HelloWorldService.java
package com.micmiu.xfire.demo.
import javax.jws.WebS
* @author Michael
public interface HelloWorldService {
* return welcome
* @param username
String sayHello(String username);
12345678910111213141516171819
package com.micmiu.xfire.demo.client;&import javax.jws.WebService;&/** * * @blog
* @author Michael */public interface HelloWorldService {& /**
* return welcome
* @param username
*/ String sayHello(String username);&}
客户端调用测试类:HelloClient4Default.java
package com.micmiu.xfire.demo.
import org.codehaus.xfire.client.XFireProxyF
import org.codehaus.xfire.service.S
import org.codehaus.xfire.service.binding.ObjectServiceF
* @author Michael
public class HelloClient4Default {
* @param args
public static void main(String[] args) {
String wsURL = ":8080/xfire-base-demo/services/HelloWorldService";
System.out.println(" ----& 初始客户端 &---- ");
Service serviceModel = new ObjectServiceFactory()
.create(HelloWorldService.class);
// Service serviceModel = new ObjectServiceFactory().create(
// HelloWorldService.class, "HelloWorldService",
// "http://demo./HelloWoldService", null);
HelloWorldService client = (HelloWorldService) new XFireProxyFactory()
.create(serviceModel, wsURL);
System.out.println(client.sayHello("Michael"));
System.out.println(" ----& 客户端调用结束 &---- ");
} catch (Exception e) {
e.printStackTrace();
1234567891011121314151617181920212223242526272829303132333435363738
package com.micmiu.xfire.demo.client;&import org.codehaus.xfire.client.XFireProxyFactory;import org.codehaus.xfire.service.Service;import org.codehaus.xfire.service.binding.ObjectServiceFactory;&/** * * @blog
* @author Michael */public class HelloClient4Default {& /**
* @param args
*/ public static void main(String[] args) {&
String wsURL = ":8080/xfire-base-demo/services/HelloWorldService";
System.out.println(" ----& 初始客户端 &---- ");
Service serviceModel = new ObjectServiceFactory()
.create(HelloWorldService.class);&
// Service serviceModel = new ObjectServiceFactory().create(
// HelloWorldService.class, "HelloWorldService",
// "http://demo./HelloWoldService", null);&
HelloWorldService client = (HelloWorldService) new XFireProxyFactory()
.create(serviceModel, wsURL);
System.out.println(client.sayHello("Michael"));
System.out.println(" ----& 客户端调用结束 &---- ");
} catch (Exception e) {
e.printStackTrace();
ps:注意代码中的 webservice的URL 没有后缀 ?wsdl
运行日志:
----& 初始客户端 &----
Hi,Michael welcome,see more
----& 客户端调用结束 &----
----> 初始客户端 <----Hi,Michael welcome,see more http:// ----> 客户端调用结束 <----
[三]、根据JSR 181注解实现代理客户端
修改上面 [一] 中的服务接口类,添加@webService 注解:HelloWorldService.java
package com.micmiu.xfire.demo.
import javax.jws.WebS
* @author Michael
@WebService
public interface HelloWorldService {
* return welcome
* @param username
String sayHello(String username);
1234567891011121314151617181920
package com.micmiu.xfire.demo.client;&import javax.jws.WebService;&/** * * @blog
* @author Michael */@WebServicepublic interface HelloWorldService {& /**
* return welcome
* @param username
*/ String sayHello(String username);&}
编写客户端代码:HelloClient4JSR181Annotation.java
package com.micmiu.xfire.demo.
import org.codehaus.xfire.annotations.AnnotationServiceF
import org.codehaus.xfire.client.XFireProxyF
import org.codehaus.xfire.service.S
* @author Michael
public class HelloClient4JSR181Annotation {
* @param args
public static void main(String[] args) {
String wsURL = ":8080/xfire-base-demo/services/HelloWorldService";
System.out.println(" ----& 初始客户端 &---- ");
Service serviceModel = new AnnotationServiceFactory()
.create(HelloWorldService.class);
HelloWorldService client = (HelloWorldService) new XFireProxyFactory()
.create(serviceModel, wsURL);
System.out.println(client.sayHello("Michael"));
System.out.println(" ----& 客户端调用结束 &---- ");
} catch (Exception e) {
e.printStackTrace();
1234567891011121314151617181920212223242526272829303132333435
package com.micmiu.xfire.demo.client;&import org.codehaus.xfire.annotations.AnnotationServiceFactory;import org.codehaus.xfire.client.XFireProxyFactory;import org.codehaus.xfire.service.Service;&/** * * @blog
* @author Michael */public class HelloClient4JSR181Annotation {& /**
* @param args
*/ public static void main(String[] args) {&
String wsURL = ":8080/xfire-base-demo/services/HelloWorldService";
System.out.println(" ----& 初始客户端 &---- ");
Service serviceModel = new AnnotationServiceFactory()
.create(HelloWorldService.class);&
HelloWorldService client = (HelloWorldService) new XFireProxyFactory()
.create(serviceModel, wsURL);
System.out.println(client.sayHello("Michael"));
System.out.println(" ----& 客户端调用结束 &---- ");
} catch (Exception e) {
e.printStackTrace();
ps:注意代码中的 webservice的URL 没有后缀 ?wsdl
运行日志:
----& 初始客户端 &----
Hi,Michael welcome,see more
----& 客户端调用结束 &----
----> 初始客户端 <----Hi,Michael welcome,see more http:// ----> 客户端调用结束 <----
[四]、根据WSDL自动生成客户端代码
目录结构如下:
E:\software code\xFire&tree
├─client-src
E:\software code\xFire>tree├─client-src│└─lib
运用WsGen命令生成代码:
java -cp .;./lib/* org.codehaus.xfire.gen.WsGen -wsdl :8080/xfire-base-demo/services/HelloWorldService?wsdl -o ./client-src -p com.micmiu.xfire.demo.base.client -overwrite true
java -cp .;./lib/* org.codehaus.xfire.gen.WsGen -wsdl http://:8080/xfire-base-demo/services/HelloWorldService?wsdl -o ./client-src -p com.micmiu.xfire.demo.base.client -overwrite true
参数说明:
: 指定wsdl文件或者URL
: 指定输出目录
: 指定客户端代码的包结构
: 指定绑定:jaxb 或 xmlbeans
-overwrite : 指定是否覆盖
运行日志:
E:\software code\xFire&java -cp .;./lib/* org.codehaus.xfire.gen.WsGen -wsdl htt
p://:8080/xfire-base-demo/services/HelloWorldService?wsdl -o ./cl
ient-src -p com.micmiu.xfire.demo.base.client -overwrite true
Running WsGen...
: :8080/xfire-base-demo/services/HelloWorldService
package : com.micmiu.xfire.demo.base.client
: ./client-src
externalBindings :
explictAnnotation : false
overwrite : true
serverStub : true
forceBare : false
18:26:22 org.codehaus.xfire.gen.Wsdl11Generator generate
信息: Generating code for WSDL at :8080/xfire-base-demo/se
rvices/HelloWorldService?wsdl with a base URI of :8080/xfi
re-base-demo/services/HelloWorldService?wsdl
18:26:23 org.codehaus.xfire.gen.jsr181.AbstractServiceGenerator genera
信息: Creating class com.micmiu.xfire.demo.base.client.HelloWorldServicePortType
18:26:23 org.codehaus.xfire.gen.jsr181.AbstractServiceGenerator genera
信息: Creating class com.micmiu.xfire.demo.base.client.HelloWorldServiceImpl
com\micmiu\xfire\demo\hellowoldservice\ObjectFactory.java
com\micmiu\xfire\demo\hellowoldservice\SayHello.java
com\micmiu\xfire\demo\hellowoldservice\SayHelloResponse.java
com\micmiu\xfire\demo\hellowoldservice\package-info.java
com\micmiu\xfire\demo\base\client\HelloWorldServiceClient.java
com\micmiu\xfire\demo\base\client\HelloWorldServiceImpl.java
com\micmiu\xfire\demo\base\client\HelloWorldServicePortType.java
1234567891011121314151617181920212223242526272829303132333435
E:\software code\xFire>java -cp .;./lib/* org.codehaus.xfire.gen.WsGen -wsdl http://:8080/xfire-base-demo/services/HelloWorldService?wsdl -o ./client-src -p com.micmiu.xfire.demo.base.client -overwrite trueRunning WsGen...wsdl&&&&: http://:8080/xfire-base-demo/services/HelloWorldService?wsdlpackage : com.micmiu.xfire.demo.base.clientoutput&&: ./client-srcbinding :externalBindings :baseURI :profile :explictAnnotation : falseoverwrite : trueserverStub : trueforceBare : false2012-7-30 18:26:22 org.codehaus.xfire.gen.Wsdl11Generator generate信息: Generating code for WSDL at http://:8080/xfire-base-demo/services/HelloWorldService?wsdl with a base URI of http://:8080/xfire-base-demo/services/HelloWorldService?wsdl2012-7-30 18:26:23 org.codehaus.xfire.gen.jsr181.AbstractServiceGenerator generate信息: Creating class com.micmiu.xfire.demo.base.client.HelloWorldServicePortType&2012-7-30 18:26:23 org.codehaus.xfire.gen.jsr181.AbstractServiceGenerator generate信息: Creating class com.micmiu.xfire.demo.base.client.HelloWorldServiceImplcom\micmiu\xfire\demo\hellowoldservice\ObjectFactory.javacom\micmiu\xfire\demo\hellowoldservice\SayHello.javacom\micmiu\xfire\demo\hellowoldservice\SayHelloResponse.javacom\micmiu\xfire\demo\hellowoldservice\package-info.javacom\micmiu\xfire\demo\base\client\HelloWorldServiceClient.javacom\micmiu\xfire\demo\base\client\HelloWorldServiceImpl.javacom\micmiu\xfire\demo\base\client\HelloWorldServicePortType.javaDone.
客户端代码生成后的目录结构如下:
E:\software code\xFire&tree /F client-src
卷 tools 的文件夹 PATH 列表
卷序列号为 AA19-63C1
E:\SOFTWARE CODE\XFIRE\CLIENT-SRC
└─micmiu
└─client
HelloWorldServiceClient.java
HelloWorldServiceImpl.java
HelloWorldServicePortType.java
└─hellowoldservice
ObjectFactory.java
package-info.java
SayHello.java
SayHelloResponse.java
└─META-INF
services.xml
1234567891011121314151617181920212223
E:\software code\xFire>tree /F client-src卷 tools 的文件夹 PATH 列表卷序列号为 AA19-63C1E:\SOFTWARE CODE\XFIRE\CLIENT-SRC├─com│&&└─micmiu│&&&&&&└─xfire│&&&&&&&&&&└─demo│&&&&&&&&&&&&&&├─base│&&&&&&&&&&&&&&│&&└─client│&&&&&&&&&&&&&&│&&&&&&&&&&HelloWorldServiceClient.java│&&&&&&&&&&&&&&│&&&&&&&&&&HelloWorldServiceImpl.java│&&&&&&&&&&&&&&│&&&&&&&&&&HelloWorldServicePortType.java│&&&&&&&&&&&&&&││&&&&&&&&&&&&&&└─hellowoldservice│&&&&&&&&&&&&&&&&&&&&&&ObjectFactory.java│&&&&&&&&&&&&&&&&&&&&&&package-info.java│&&&&&&&&&&&&&&&&&&&&&&SayHello.java│&&&&&&&&&&&&&&&&&&&&&&SayHelloResponse.java│└─META-INF&&&&└─xfire&&&&&&&&&&&&services.xml
把上面的源代码copy到项目中即可,编写测试代码:HelloWorldGenClientTest.java
package com.micmiu.xfire.demo.base.
* @author Michael
public class HelloWorldGenClientTest {
public static void main(String[] args) throws Exception {
System.out.println(" ----& 初始客户端 &---- ");
HelloWorldServiceClient service = new HelloWorldServiceClient();
HelloWorldServicePortType client = service
.getHelloWorldServiceHttpPort();
System.out.println(client.sayHello("Michael"));
System.out.println(" ----& 客户端调用结束 &---- ");
123456789101112131415161718192021
package com.micmiu.xfire.demo.base.client;&/** * * @blog
* @author Michael */public class HelloWorldGenClientTest {& public static void main(String[] args) throws Exception {&
System.out.println(" ----& 初始客户端 &---- ");
HelloWorldServiceClient service = new HelloWorldServiceClient();
HelloWorldServicePortType client = service
.getHelloWorldServiceHttpPort();&
System.out.println(client.sayHello("Michael"));
System.out.println(" ----& 客户端调用结束 &---- ");& }}
运行结果:
----& 初始客户端 &----
Hi,Michael welcome,see more
----& 客户端调用结束 &----
----> 初始客户端 <----Hi,Michael welcome,see more http:// ----> 客户端调用结束 <----
[五]、动态客户端的实现
编写测试代码:HelloClient4Dynamic.java
package com.micmiu.xfire.demo.
import java.net.URL;
import org.codehaus.xfire.client.C
* @author Michael
public class HelloClient4Dynamic {
* @param args
public static void main(String[] args) {
String wsURL = ":8080/xfire-base-demo/services/HelloWorldService?wsdl";
System.out.println(" ----& 初始客户端 &---- ");
Client client = new Client(new URL(wsURL));
Object[] results = client.invoke("sayHello",
new Object[] { "Michael" });
System.out.println(results[0]);
System.out.println(" ----& 客户端调用结束 &---- ");
} catch (Exception e) {
e.printStackTrace();
12345678910111213141516171819202122232425262728293031323334
package com.micmiu.xfire.demo.client;&import java.net.URL;&import org.codehaus.xfire.client.Client;&/** * * @blog
* @author Michael */public class HelloClient4Dynamic {& /**
* @param args
*/ public static void main(String[] args) {&
String wsURL = ":8080/xfire-base-demo/services/HelloWorldService?wsdl";
System.out.println(" ----& 初始客户端 &---- ");
Client client = new Client(new URL(wsURL));&
Object[] results = client.invoke("sayHello",
new Object[] { "Michael" });&
System.out.println(results[0]);
System.out.println(" ----& 客户端调用结束 &---- ");
} catch (Exception e) {
e.printStackTrace();
ps:注意代码中的 webservice的URL 有后缀 ?wsdl
运行结果:
----& 初始客户端 &----
Hi,Michael welcome,see more
----& 客户端调用结束 &----
----> 初始客户端 <----Hi,Michael welcome,see more http:// ----> 客户端调用结束 <----
原创文章,转载请注明: 转载自[
本文链接地址:
- 152,689 views - 98,353 views - 58,071 views - 54,550 views - 40,754 views - 40,309 views - 34,430 views - 31,372 views - 23,487 views - 22,155 views
2015年八月 &(1)
2015年三月 &(5)
2015年二月 &(3)
2015年一月 &(12)
2014年十二月 &(4)
2014年十一月 &(3)
2014年七月 &(1)
2014年五月 &(1)
2014年四月 &(12)
2014年三月 &(4)
2014年二月 &(6)
2014年一月 &(8)
2013年十二月 &(1)
2013年十月 &(9)
2013年九月 &(7)
2013年八月 &(8)
2013年六月 &(4)
2013年五月 &(4)
2013年四月 &(3)
2013年三月 &(10)
2013年二月 &(1)
2013年一月 &(2)
2012年十二月 &(1)
2012年十一月 &(7)
2012年十月 &(2)
2012年九月 &(4)
2012年八月 &(13)
2012年七月 &(14)
2012年六月 &(12)
2012年五月 &(15)
2012年四月 &(20)
2012年三月 &(22)
2012年二月 &(86)
标签云(3D)
WP Cumulus Flash tag cloud by
9 or better.就是用xFire 调用 远程接口的时候,对方提供的wsdl 有用对象作为参数 进行传入的。自己根据wsdl描述构造的对象进行传入,客户端 Client 进行 invoke的时候,根本没有返回值。特此求问不知是否有大师对WebService熟悉的,有没有可直接传入原生xml进行接口调用,或者对于这种对象参数的传入应该怎么解决的?
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
wsdl中有参数类型的说明,可以按照此说明创建类。
如果我没记错的话,xfire有工具,根据wsdl文件生成client端需要的代码
终于搞定了,去看了xFire里面Client 的源码,其中invoke 是可以用invoke(String name, XMLStreamReader reader);用reader来作为参数的,那么在知道其原始的请求Request的情况下,可以自己构造xml,转成reader丢进去,就可以不用再为对象参数烦恼了,也不用根据wsdl生成那些多余的不必要的代码。
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (6820) 次Java调用.NET webservice方法的几种方式 -
- ITeye博客
博客分类:
&& 最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结。下面实现的是对传喜物流系统(/PodApi/GetPodStr.asmx?wsdl)的订单跟踪(web-service调用)功能。
一. 使用axis1.x调用webservice方法
Axis的最常用版本:1.4和2.0版本。以下为1.4版本
 核心代码:
& // webserviceURL
&&&&& service_url = "/PodApi/GetPodStr.asmx?wsdl";
&&&&& Service service = new Service();
&&&&& Call call = (Call) service.createCall();
&&&&& call.setTargetEndpointAddress(new java.net.URL(service_url));
// 设置要调用的方法
// http://intelink.net/是wsdl中definitions根节点的targetNamespace属性值
call.setOperationName(new QName("http://intelink.net/","GetStrByJobno"));
// 该方法需要的参数
call.addParameter("CustNo",
  org.apache.axis.encoding.XMLType.XSD_STRING,
  javax.xml.rpc.ParameterMode.IN);
call.addParameter("passwd",
   org.apache.axis.encoding.XMLType.XSD_STRING,
   javax.xml.rpc.ParameterMode.IN);
call.addParameter("Jobno",
   org.apache.axis.encoding.XMLType.XSD_STRING,
   javax.xml.rpc.ParameterMode.IN);
// 方法的返回值类型
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
// call.setUseSOAPAction(true);
//call.setSOAPActionURI("http://intelink.net/GetStrByJobno");
// 调用该方法, new Object[] { CustNo, passwd, Jobno}为参数列表
String xmlStr = call.invoke(new Object[] { CustNo, passwd, Jobno}).toString();
} catch (Exception e) {
e.printStackTrace();
}
JAVA用这种方式调用webservice,需要注意的地方:
1. 服务器未能识别 HTTP 标头 SOAPAction 的值:
症状一:
Web Service + ASP.NET 应用程序部署到服务器默认目录中,在IE中用http://&服务器地址&/&程序目录名&/&默认启动页面名&发生“服务器未能识别 HTTP 标头 SOAPAction 的值”错误。
症状二:
在Java平台上调用.NET Web Service的服务时,出现"服务器未能识别 HTTP 标头 SOAPAction 的值"。
症状三:
在Java平台下调用.NET WEB Service,出现数据时有时无。
解决对策:
给.NET的WebService类(即.asmx文件下的类)添加属性[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]
什么是SoapAction?它在WSDL中有何作用?
SOAPAction HTTP request header被用来标识SOAP HTTP请求的目的地,其值是个URI地址。SOAP发送并不限制格式、URI特征或其必须可解析,那么在这种情况下,发送一个HTTP SOAP请求时,其HTTP客户端必须使用/指明SOAPAction HTTP request header。
SOAPAction header的内容可以被用在服务端,诸如:防火墙适当的过滤基于HTTP的SOAP请求消息等场景。SOAPAction header的值为空串("")表示SOAP消息的目的地由HTTP请求的URI标识;无值则表示没有指定这条消息的目的地。
本人补充:
在.NET环境调用.NET WebService出现 “SOAPAction 值在 XML Web services 的所有方法中不唯一的错误”,也可以通过此法解决。
2. 为了Java能够调用WebService的方法,所以。NETP写的WebServiced的每个方法都要声明为Rpc方法,即添加"[SoapRpcMethod.....]".
例如:[WebMethod]
&&&&&&& [SoapRpcMethod(Use=SoapBindingUse.Literal,Action= http://tempuri.org/HelloWorld", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]
3. 对返回值、参数的处理上:
应尽量将webservice方法的返回值、参数都写成字符串(String)不要使用复杂对象类型,这样便于在网络上传输。避免了复杂对象类型的不易转换问题。。。对于返回类型是字符串数组型的,可以设置返回类型为org.apache.axis.encoding.XMLType.SOAP_VECTOR或java.lang.String[].class.
二.利用xfire调用WebService
XFire是新一代的Java Web服务引擎,XFire使得在JavaEE应用中发布Web服务变得轻而易举。和其他Web服务引擎相比,XFire的配置非常简单,可以非常容易地和Spring集成,它使得Java开发人员终于可以获得和.Net开发人员一样的开发效率。
核心代码:
Service service = new ObjectServiceFactory().create(IWebservice.class);
XFireProxyFactory factory =
new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String url= "http://localhost:8080/webservices/services/webservices";
IWebservice iw = (IWebservice) factory.create(service, url);
List list=iw.getTest();
浏览 21533
liyuandong
浏览: 247857 次
来自: 北京
相关实现比较繁琐,有兴趣的朋友可以看看我的博客《用Java实现 ...
很好,谢谢了
写得非常详细
感觉帆软报表这些采用的flash打印方式很不错啊用户名:leizhimin
文章数:733
评论数:2734
注册日期:
阅读量:1297
阅读量:3317
阅读量:455224
阅读量:1139806
51CTO推荐博文
XFire WebService开发快速起步
XFire-1.2.6
MyEclipse 6.5
Tomcat-5.5.27
Windows XP Professional简体中文版
软件下载地址:
有关WebService的概念、原理、数据发现、描述、绑定等过程、方式也不说了。这里就只关注如何快速开发出来一个通用的、易懂的Hello World例子。
以下是开发步骤:
1、创建工程
打开MyEclipse 6.5,新建一个WebService工程。如下图
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/469388.png" border="0" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/481060.png" border="0" />
然后一路next,直到完成。
创建完成后,打开生成的web.xml文件,可以看到,XFire已经配置好了。
&?xml version="1.0" encoding="UTF-8"?& &web-app xmlns="/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="/xml/ns/javaee&&&& [url]/xml/ns/javaee/web-app_2_5.xsd[/url]"& &&&&&servlet& &&&&&&&&&servlet-name&XFireServlet&/servlet-name& &&&&&&&&&servlet-class&org.codehaus.xfire.transport.http.XFireConfigurableServlet&/servlet-class& &&&&&&&&&load-on-startup&0&/load-on-startup& &&&&&/servlet& &&&&&servlet-mapping& &&&&&&&&&servlet-name&XFireServlet&/servlet-name& &&&&&&&&&url-pattern&/services/*&/url-pattern& &&&&&/servlet-mapping& &&&&&welcome-file-list& &&&&&&&&&welcome-file&index.jsp&/welcome-file& &&&&&/welcome-file-list& &/web-app&
<font color="#、创建WebService服务
创建两个个包“wstest.server”和“wstest.client”,用来保存服务端和客户端程序。然后开始创建服务端程序,如下图
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/527732.png" border="0" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/543107.png" border="0" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/567404.png" border="0" />
完成后,生成了一个Service的配置services.xml:
&?xml version="1.0" encoding="UTF-8"?& &beans xmlns="http://xfire.codehaus.org/config/1.0"& &&&service& &&&&&name&MyService&/name& &&&&&serviceClass&wstest.server.IMyService&/serviceClass& &&&&&implementationClass& &&&&&&wstest.server.MyServiceImpl &&&&&/implementationClass& &&&&&style&wrapped&/style& &&&&&use&literal&/use& &&&&&scope&application&/scope& &&&/service& &/beans&
也生成了接口和默认实现,改写后如下:
package wstest. //Generated by MyEclipse public interface IMyService { &&&&&&public String sayHello(String user); &&&&}
package wstest. //Generated by MyEclipse public class MyServiceImpl implements IMyService { &&&&&&public String sayHello(String user) { &&&&return "您好,"+ &&} &&&&}
至此,服务端代码已经完成。
3、测试服务端代码
测试依赖与Servlet容器Tomcat,需要将做好的服务端打包部署到tomcat上,然后启动。才可以进行测试。假设你已经配置了Tomcat服务器,并完成了WebService服务端的部署。那么,现在就启动Tomcat,然后:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/626279.png" border="0" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/649435.png" border="0" />
输入访问地址:& ,然后go一把!
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/709170.png" border="0" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/725060.png" border="0" />
这样,出现上上面的结果,表明测试成功了。
4、生成客户端代码
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/068248.png" border="0" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/101795.png" border="0" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/112279.png" border="0" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/137967.png" border="0" />
很郁闷,这个生成的客户端代码一部分跑到服务端的包里面了。真是垃圾,rubbish!!!
但是,这就是MyEclipse的功能,我改变不了。
5、客户端测试
下面就耐心看怎么用这个客户端代码。
打开生成的代码如下:
package wstest. import java.net.MalformedURLE import java.util.C import java.util.HashM import javax.xml.namespace.QN import org.codehaus.xfire.XFireRuntimeE import org.codehaus.xfire.aegis.AegisBindingP import org.codehaus.xfire.annotations.AnnotationServiceF import org.codehaus.xfire.annotations.jsr181.Jsr181WebA import org.codehaus.xfire.client.XFireProxyF import org.codehaus.xfire.jaxb2.JaxbTypeR import org.codehaus.xfire.service.E import org.codehaus.xfire.service.S import org.codehaus.xfire.soap.AbstractSoapB import org.codehaus.xfire.transport.TransportM public class MyServiceClient { &&&&&&&&private static XFireProxyFactory proxyFactory = new XFireProxyFactory(); &&&&&&&&private HashMap endpoints = new HashMap(); &&&&&&&&private Service service0; &&&&&&&&public MyServiceClient() { &&&&&&&&&&&&&&&&create0(); &&&&&&&&&&&&&&&&Endpoint MyServicePortTypeLocalEndpointEP = service0 .addEndpoint(new QName("http://server.wstest", "MyServicePortTypeLocalEndpoint"), new QName("http://server.wstest", "MyServicePortTypeLocalBinding"), "xfire.local://MyService"); &&&&&&&&&&&&&&&&endpoints.put(new QName("http://server.wstest", "MyServicePortTypeLocalEndpoint"), MyServicePortTypeLocalEndpointEP); &&&&&&&&&&&&&&&&Endpoint MyServiceHttpPortEP = service0 .addEndpoint(new QName("http://server.wstest", "MyServiceHttpPort"), new QName("http://server.wstest", "MyServiceHttpBinding"), "http://localhost:8080/xfire126Demo/services/MyService"); &&&&&&&&&&&&&&&&endpoints.put(new QName("http://server.wstest", "MyServiceHttpPort"), MyServiceHttpPortEP); &&&&&&&&} &&&&&&&&public Object getEndpoint(Endpoint endpoint) { &&&&&&&&&&&&&&&&try { &&&&&&&&&&&&&&&&&&&&&&&&return proxyFactory.create((endpoint).getBinding(), (endpoint).getUrl()); &&&&&&&&&&&&&&&&} catch (MalformedURLException e) { &&&&&&&&&&&&&&&&&&&&&&&&throw new XFireRuntimeException("Invalid URL", e); &&&&&&&&&&&&&&&&} &&&&&&&&} &&&&&&&&public Object getEndpoint(QName name) { &&&&&&&&&&&&&&&&Endpoint endpoint = ((Endpoint) endpoints.get((name))); &&&&&&&&&&&&&&&&if ((endpoint) == null) { &&&&&&&&&&&&&&&&&&&&&&&&throw new IllegalStateException("No such endpoint!"); &&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&return getEndpoint((endpoint)); &&&&&&&&} &&&&&&&&public Collection getEndpoints() { &&&&&&&&&&&&&&&&return endpoints.values(); &&&&&&&&} &&&&&&&&private void create0() { &&&&&&&&&&&&&&&&TransportManager tm = (org.codehaus.xfire.XFireFactory.newInstance().getXFire().getTransportManager()); &&&&&&&&&&&&&&&&HashMap props = new HashMap(); &&&&&&&&&&&&&&&&props.put("annotations.allow.interface", true); &&&&&&&&&&&&&&&&AnnotationServiceFactory asf = new AnnotationServiceFactory(new Jsr181WebAnnotations(), tm, new AegisBindingProvider(new JaxbTypeRegistry())); &&&&&&&&&&&&&&&&asf.setBindingCreationEnabled(false); &&&&&&&&&&&&&&&&service0 = asf.create((wstest.client.MyServicePortType.class), props); &&&&&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&&&&&&&&AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://server.wstest", "MyServiceHttpBinding"), "http://schemas.xmlsoap.org/soap/http"); &&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&&&&&&&&AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://server.wstest", "MyServicePortTypeLocalBinding"), "urn:xfire:transport:local"); &&&&&&&&&&&&&&&&} &&&&&&&&} &&&&&&&&public MyServicePortType getMyServicePortTypeLocalEndpoint() { &&&&&&&&&&&&&&&&return ((MyServicePortType)(this).getEndpoint(new QName("http://server.wstest", "MyServicePortTypeLocalEndpoint"))); &&&&&&&&} &&&&&&&&public MyServicePortType getMyServicePortTypeLocalEndpoint(String url) { &&&&&&&&&&&&&&&&MyServicePortType var = getMyServicePortTypeLocalEndpoint(); &&&&&&&&&&&&&&&&org.codehaus.xfire.client.Client.getInstance(var).setUrl(url); &&&&&&&&&&&&&&&&return &&&&&&&&} &&&&&&&&public MyServicePortType getMyServiceHttpPort() { &&&&&&&&&&&&&&&&return ((MyServicePortType)(this).getEndpoint(new QName("http://server.wstest", "MyServiceHttpPort"))); &&&&&&&&} &&&&&&&&public MyServicePortType getMyServiceHttpPort(String url) { &&&&&&&&&&&&&&&&MyServicePortType var = getMyServiceHttpPort(); &&&&&&&&&&&&&&&&org.codehaus.xfire.client.Client.getInstance(var).setUrl(url); &&&&&&&&&&&&&&&&return &&&&&&&&} &&&&&&&&public static void main(String[] args) { &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&MyServiceClient client = new MyServiceClient(); &&&&&&&&&&&&&&&& &&&&//create a default service endpoint &&&&&&&&&&&&&&&&MyServicePortType service = client.getMyServiceHttpPort(); &&&&&&&&&&&&&&&& &&&&//TODO: Add custom client code here &&&&&&&&&&&&&&&&&&&&// &&&&&&&&&&&&&&&&&&&&//service.yourServiceOperationHere(); &&&&&&&&&&&&&&&& &&&&System.out.println("test client completed"); &&&&&&&&&&&&&&&&&&&&System.exit(0); &&&&&&&&} }
看得很晕,不知道啥意思,但是从“TODO”标记处,我知道了:
&&&&//TODO: Add custom client code here &&&&&&&&&&&&&&&&&&&&// &&&&&&&&&&&&&&&&&&&&//service.yourServiceOperationHere();
现在就在这里添加测试代码吧:
&&&&//TODO: Add custom client code here &&&&&&&&&&&&&&&&&&&&// &&&&&&&&&&&&&&&&&&&&//service.yourServiceOperationHere(); &&&&&&&&&&&&&&&&String helloString = service.sayHello("熔岩"); &&&&&&&&&&&&&&&&System.out.println(helloString);
添加了很傻蛋的两行代码后,就可以运行起来看看测试代码了。
运行结果如下:
您好,熔岩 test client completed
终于可以松一口气了。完整的例子跑起来了。
总感觉这个开发过程不爽,其实有更好的工具和开发方式:
WebService的编写,比较麻烦的是客户端代码,客户端代码依靠人工去写基本上是不可能的,除非你愿意付出惊人的时间和精力,既便如此也得不偿失。
MyEclipse的客户端开发太差,主要是生成的客户端代码混乱,解决办法是将客户端的编写放到单独一个工程里面来做。
其实,只要服务端编写好了,就完全可以用别的方式根据wsdl的url去生成客户端代码,在这里不得不将一个强大的工具IDEA8推荐出来,IDEA8自带WebService开发工具,插件非常强大,易用。在后面的篇幅中,我会做专门介绍,敬请关注。
当然,MyEclipse也并非一无是处,MyEclipse的服务端调试工具就很不错,很喜欢。提高了开发效率,这也是MyEclipse的过人之处。
最后,告诫各位,即使WebService支持复杂对象参数,也不建议使用,因为数据绑定还不是那么完美,总有些缺憾,为了保险起见,还是建议使用String作为参数最好了。本文出自 “” 博客,转载请与作者联系!
了这篇文章
附件下载:  
类别:┆阅读(0)┆评论(0)
11:11:23 20:00:48 10:48:00 09:39:45 09:53:23 23:03:01 15:13:31 09:50:25 10:43:16 11:53:39 10:15:17 11:02:55 11:14:30 11:15:11 17:55:10
请输入验证码:

我要回帖

更多关于 xfire客户端调用wsdl 的文章

 

随机推荐