手把手教你用axis创建自己的webservice(四)
手把手教你用axis创建自己的webservice(三)
进入接口所在源文件的文件夹(包的最上层,如果包名是com.yy.ws则需要在com的上一层目录下如classes),我的文件夹结构是classes/com/yy/ws/所以我需要进入源文件目录:
C:\ws>cd classes
在控制台输入如下命令:
C:\ws\classes> java org.apache.axis.wsdl.Java2WSDL -o mb.wsdl -l “http://localhost:8080/axis/services/MobileBoss” -n “urn:MobileBoss” -p”com.yy.ws” “urn:MobileBoss” com.yy.ws.MobileBoss
参数说明: -o 输出wsdl文件名称
-l 访问的url
-n 命名空间
-p 包名 命名空间的名字(urn:是命名空间的缩写,必须有!)
com.yy.ws.MobileBoss 是接口的全路径。包名+类名。 更多详细内容 »
手把手教你用axis创建自己的webservice(二)
手把手教你用axis创建自己的webservice (一)
随着SOA的流行,webservice开发也变得相当的热门。许多企业都将自己的网站迁移到soa的架构。今天我们来一起体验一下通过axis来创建、发布和调用webservice的过程。如果大家不太了解SOA请访问下面网址(http://www-900.ibm.com/cn/software/rational/solution/tech/soa_design.shtml)
在开始之前我默认大家已经具有axis的安装经验,如果对axis安装和配置发布有任何问题请看http://yangyang.javaeye.com/blog/56519 和http://yangyang.javaeye.com/blog/56552两篇文章。let's go!
首先我们先假设一个需求。我们需要一个service,功能是给手机充值,充值成功后返回操作代码和消息。给手机充值需要手机号、充值金额、操作类型。操作成功或者失败后返回操作代码和消息。在这里我们将客户端的请求和服务器端响应进行了包装代码如下: 更多详细内容 »
Tags: Axis[codes=java]
package Example6;
/**
* @author Jock
*
*/
public final class TestClient {
/**
* @param args
*/
public static void main(String[] args) {
//获得一个locator对象
WidgetPriceServiceLocator locator = new WidgetPriceServiceLocator();
locator.setMaintainSession(true);
try{
WidgetPrice s = locator.getWidgetPrice();
s.setWidgetPrice(“1″,”10.67″);
s.setWidgetPrice(“2″,”12.45″);
s.setWidgetPrice(“3″,”11.37″);
s.setWidgetPrice(“4″,”13.29″);
System.out.println(s.getWidgetPrice(“4″));
System.out.println(s.getWidgetPrice(“3″));
System.out.println(s.getWidgetPrice(“2″));
System.out.println(s.getWidgetPrice(“1″));
}catch(Exception e){
e.printStackTrace();
}
}
}
[/codes]
执行java Example6.TestClient
输出:
13.29
11.37
12.45
10.67
继续axis的example6
设置好环境变量classpath及ant等,
编译example6,进入axis-1_4\samples\userguide\example6目录,
修改build.xml文件中java2wsdl中的location一项为正确的url。
执行ant。
编译好的文件在axis-1_4\build\work\samples\userguide\example6目录下,
文件清单:
build.xml
deploy.wsdd
Main.class
Main.java
undeploy.wsdd
WidgetPrice.class
WidgetPrice.java
WidgetPrice.wsdl
WidgetPriceService.class
WidgetPriceService.java
WidgetPriceServiceLocator.class
WidgetPriceServiceLocator.java
WidgetPriceServiceTestCase.class
WidgetPriceServiceTestCase.java
WidgetPriceSoapBindingImpl.class
WidgetPriceSoapBindingImpl.java
WidgetPriceSoapBindingSkeleton.class
WidgetPriceSoapBindingSkeleton.java
WidgetPriceSoapBindingStub.class
WidgetPriceSoapBindingStub.java
进入该目录执行发布服务的命令
java org.apache.axis.client.AdminClient -lhttp://localhost/services/AdminService deploy.wsdd
访问http://localhost/servlet/AxisServlet,可以看见多了一个服务。
WidgetPrice (wsdl)
setWidgetPrice
getWidgetPrice
继续客户端调用的实践。。。
小试牛刀
对axis提供的sample/example2/Calculator试用,
将Calculator.java放到resin的webapp目录下,根据返回的wsdl生成代码,
D:\source\webservice\src>java org.apache.axis.wsdl.WSDL2Java –server-side –skeletonDeploy true Calculator.wsdl
写一个测试客户端例子
[codes=java]
/**
*
*/
package cn.org.jock.axis.Calculator_jws;
/**
* @author Jock
*
*/
public final class TestClient {
/**
* @param args
*/
public static void main(String[] args) {
//获得一个locator对象
CalculatorServiceLocator locator = new CalculatorServiceLocator();
locator.setMaintainSession(true);
try{
Calculator service = locator.getCalculator();
int a = service.add(3, 4);
int b = service.subtract(9, 3);
System.out.println(a+"\n"+b);
}catch(Exception e){
e.printStackTrace();
}
}
}
[/codes]
就可以像调用本地方法一样调用了。继续学习怎么使用自定义的对象。
执行WSDL2Java时报告" 类型被引用但未定义"
问题描述
WEB服务接口编写完成并发布后,客户端测试程序收不到WEB服务的返回结果,Apache或Resin的log中也看不到访问记录。但测试程序返回结果为0(成功),在没有部署该WEB服务的情况下,也是这个结果,因此怀疑调用的是WSDL文件的提供者自己测试用的WEB服务接口,可能与另一方提供的WSDL文件有关。
原因分析
合作伙伴调用WEB服务就能够成功,从WEB服务主机自己的客户端调用就接收不到数据,估计与合作伙伴提供的WSDL文件有关,该WSDL文件影响了WSDL2Java生成的客户端stub代码。检查stub代码,发现其soapAction都指向了合作伙伴的测试地址。
解决方法
修改stub代码中的soapAction,改为sp(Service Provider)自己的WEB服务URL。重新编译程序并发布Web服务,问题解决。
_call.setSOAPActionURI("sp自己的Web服务地址");
小结
本小节描述的问题出现于Web服务提供方按合作伙伴统一提供的WSDL文件生成客户端代码的情况。遇到这类问题,读者可直接检查WSDL2Java自动生成的代码的有关部分。
在WSDL文件中可以看到与下列内容相似的设置。
<wsdl:service name="SPInterfaceForVNet">
<wsdl:port binding="impl:SPInterfaceSoapSoapBinding" name="SPInterfaceForVNetSoap">
<wsdlsoap:address location="http://test.com/services/SPInterfaceSoap" />
</wsdl:port>
</wsdl:service>
其中 http://test.com/services/SPInterfaceSoap即为已发布的WEB服务的URL,供客户端调用。
近期评论