十一 04

生成或取得WSDL文件

Java2WSDL是Axis提供的利用Java类文件得到WSDL文件的工具。类文件可以使用接口文件编译生成,例如下面的接口文件SoftwarePrice.java。



package samples.userguide.example6;
/**
* Interface describing a web service to set and get software prices.
**/
public interface SoftwarePrice {
   public void setWidgetPrice(String softWareName, String price);
   public String getWidgetPrice(String softWareName);



编译SoftwarePrice.java。



javac SoftwarePrice.java



将SoftwarePrice.class复制到正确的package路径下。

执行下面的命令:



java org.apache.axis.wsdl.Java2WSDL -o sp.wsdl  -l"http://test.com:80/services/SoftwarePrice" -n "urn:SoftwarePrice"
-p"samples.userguide.example6" "urn:Example6" samples.userguide.example6.SoftwarePrice



各参数的含义如下。



-o:指定输出的WSDL文件的文件名。
       
-l:指定服务的位置。
       
-n:WSDL文件的目标名字空间。
       
-p:指定从package到名字空间的映射,这里可以有多个映射。
       
     
     


最后面的类文件包含了Web服务的接口。

该命令执行后,将生成sp.wsdl文件。

如果按CLASSPATH的设置找不到指定的类文件,Axis将报告异常,如下所示。



java.lang.ClassNotFoundException: samples.userguide.example6.SoftwarePrice
       at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
       at java.security.AccessController.doPrivileged(Native Method)
 ……



如果出现上面的问题,请检查是否已将有关类文件复制到正确的位置或CLASSPATH设置是否正确。

生成WSDL文件以后,就可以利用Axis提供的WSDL2Java工具生成Web服务的服务端代码和客户端代码了。

注意事项

WSDL文件也可以由合作伙伴提供。这种情况下合作伙伴往往是Web服务的提供者或标准接口的制定者,开发者只要按照既定的WSDL文件生成客户端或服务端代码就可以了。

生成客户端或服务端代码

WSDL2Java工具用于从WSDL文件生成客户端存根(stub)代码,服务端框架(skeleton)代码以及WSDL中的数据类型文件(生成与之对应的Java代码)。开发人员只需向框架代码中补充相关的业务逻辑代码即可得到完整的Web服务代码,因此该工具极大地减轻了开发人员的编码负担。WSDL2Java的使用举例如下。



java org.apache.axis.wsdl.WSDL2Java –server-side –skeletonDeploy true MyService.wsdl



执行上述命令后将生成下列文件。

No. 文件 用途
1. deploy.wsdd MyService服务的部署描述文件
2. MyService.java MyService服务的接口文件
3. MyServiceService.java 获得MyService服务的接口文件
4. MyServiceServiceLocator.java 实现MyServiceService接口
5. MyServiceSoapBindingImpl.java 实现MyService接口,应向其中补充业务逻辑
6. MyServiceSoapBindingSkeleton.java MyService服务的服务端框架代码,实现MyService, org.apache.axis.wsdl.Skeleton接口
7. MyServiceSoapBindingStub.java MyService服务的客户端存根代码,实现MyService接口
8. undeploy.wsdd 注销MyService服务的部署描述文件


编写Web服务客户端代码

Web服务的客户端程序完成对Web服务的调用,其程序结构如下。



import com.chinavnet.zx.service.v1_0.*;// WSDL2Java生成的package的名字空间;
public class TestClient {
   public static void main (String[] args) throws Exception
{
 com.chinavnet.zx.service.v1_0.SPInterfaceForVNetLocator locator = new  SPInterfaceForVNetLocator();//获得一个locator对象
 locator.setMaintainSession(true);
 com.chinavnet.zx.service.v1_0.SPInterfaceForVNetSoap service = locator.getSPInterfaceForVNetSoap();//获得服务对象
 com.chinavnet.zx.service.v1_0.DetailLedgerFeedbackResult feedbackRes = null;
 //初始化Web服务中定义的数据类型
       try {
 feedbackRes =  service.generalLedgerFeedback();//调用Web服务的方法并取得返回值
  System.out.println("FeedbackResult :");
  if(feedbackRes != null)
  {
   System.out.println("SPID: " +feedbackRes.getSPID());
   System.out.println("errorDesc: " +feedbackRes.getErrorDescription());
   System.out.println("result: " +feedbackRes.getResult());
  }else
  {
   System.out.println("feedbackRes is null!");
  }
       } catch (java.rmi.RemoteException re) {
//           throw new junit.framework.AssertionFailedError("Remote Exception caught: " + re );
    re.printStackTrace();
       }
}//End of main()
}//End of TestClient class



测试客户端程序是非常简单的,将客户端程序编译后,执行"java TestClient"即可。


Tags: ,

作者:Jock

Leave a Reply

You must be logged in to post a comment.

Switch to our mobile site