wsdl2java "XXX is referenced but not defined."解决办法

来源:互联网 发布:淘宝企业店铺运营方案 编辑:程序博客网 时间:2024/04/30 09:21

   最近又开始研究使用AXIS提供WebService的方法了,按照教程基本实现了Java提供的WebService客户端的调用,而且本WebService的调用参数以及回显参数都为自定义对象angelDosRequest以及angelDosResponse。

   

   服务端配置代码 一个服务接口类ITT_PeTraceWebSvc,一个接口实现类PeTraceWebSvcImp

 

 

 

重点在于deploy.wsdd配置:

 

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 <!-- Services from TestAxisService WSDL service -->

 <service name="TTL_PETraceAirportData" provider="java:RPC" style="wrapped" use="literal">   <!-- 服务名称,自己定义 -->

  <parameter name="wsdlTargetNamespace" value="http://petrace.com"/>                 <!-- 将显示在wsdl上的命名空间 ,自己定义-->

  <parameter name="wsdlServiceElement" value="TTL_PETraceAirportData"/>                      <!-- 将显示在wsdl中wsdl:service节点的 name属性, 自己定义-->

  <parameter name="schemaQualified" value="http://petrace.com"/>                  <!-- 自己定义-->

  <parameter name="wsdlServicePort" value="PeTraceBiz"/>                  <!-- 将显示在wsdl中wsdl:port节点的 name属性, 自己定义 -->

  <parameter name="className" value="com.travelsky.pe.webservice.impl.TTL_PeTraceWebSvcImpl"/>                  <!-- 实现类名,要带上包名 -->

  <parameter name="wsdlPortType" value="ITTL_PeTraceWebSvc"/>                       <!-- 接口名 -->

  <parameter name="typeMappingVersion" value="1.2"/>

  <!-- 下面就是对方法的描述了,要写对方法的名字,返回值类型和参数的名字和类型 -->

    <operation name="AirportDataBiz" qname="operNS:AirportDataBiz" xmlns:operNS="http://petrace.com" returnQName="retNS:angelDosResponse" xmlns:retNS="http://petrace.com" returnType="retNS:angelDosResponse" xmlns:rtns="http://www.w3.org/2001/XMLSchema" soapAction="" >

  <parameter qname="pns:angelDosRequest" xmlns:pns="http://petrace.com" type="pns:angelDosRequest" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>

  </operation>


  <parameter name="allowedMethods" value="AirportDataBiz"/> <!-- value里面用空格隔开方法名 -->

  <!-- 串行化的关键就在下面这里了,对自定义类型wsResult的描述。。。注意type属性里要带上包名 -->

  <typeMapping xmlns:ns="http://petrace.com" qname="ns:angelDosRequest" type="java:com.travelsky.pe.util.AngelDosRequest" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="" />

    <typeMapping xmlns:ns="http://petrace.com" qname="ns:angelDosResponse" type="java:com.travelsky.pe.util.AngelDosResponse" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="" />
 
  </service>

</deployment>

 

使用如下命令生成server-config.wsdd:

 

      set Axis_Lib=E:/axis-1_4/lib

  set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%

  set Axis_Servlet=http://localhost:8080/pe-speservice/services/AdminService

  %Java_Cmd% org.apache.axis.client.AdminClient -l %Axis_Servlet% E:/opt/deploy.wsdd

 

客户端测试代码,自己手写的(要把AXIS中除了axis-ant.jar的包都加上):

 

public static void main(String[] args) {
 
    String targetEndPoint="http://localhost:8080/pe-speservice/services/TTL_PETraceAirportData";   
  
    Service service = new Service();
      
    try {
   Call call = (Call) service.createCall();
   
   call.setTargetEndpointAddress(targetEndPoint);  
         
      call.setOperation("AirportDataBiz" );   
    
      AngelDosRequest request=new AngelDosRequest();
     
      request.setMessageFunction("APT_PUT");
     
      AngelDosResponse response=new AngelDosResponse();
     
   try {
    
    QName qn_request = new QName("http://petrace.com","angelDosRequest");
    
    call.registerTypeMapping(AngelDosRequest.class,qn_request,
            new BeanSerializerFactory(AngelDosRequest.class, qn_request),
      new BeanDeserializerFactory(AngelDosRequest.class, qn_request));
    
                QName qn_response = new QName("http://petrace.com","angelDosResponse");
    
    call.registerTypeMapping(AngelDosResponse.class,qn_response,
            new BeanSerializerFactory(AngelDosResponse.class, qn_response),
      new BeanDeserializerFactory(AngelDosResponse.class, qn_response));
    
    call.setReturnClass(AngelDosResponse.class);    
    
    call.setTargetEndpointAddress(targetEndPoint);
    
    call.setOperation("AirportDataBiz");   
   
    
    response = (AngelDosResponse)call.invoke(new Object[]{request});                  
    
    System.out.println("result="+response.getResultMsg());  
    
    
   } catch (RemoteException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }  
          

  } catch (ServiceException e) {
 
   e.printStackTrace();
  }
        

  
 }

 

到这里即可宣告WebService的发布和调用了。

 

然而,为了实现客户端程序的自动发布,看到了一种方式,即在发布目录的web-inf目录下执行如下代码,

 

java  -Djava.ext.dirs=lib  org.apache.axis.wsdl.WSDL2Java http://localhost:8080/pe-speservice/services/TTL_PETraceAirportData?wsdl

 

可生成相应的客户端代码,

 

但是在调用时 总提示错误为

java.io.IOException: Type {http://www.w3.org/2001/XMLSchema}angelDosResponse is
referenced but not defined.
        at org.apache.axis.wsdl.symbolTable.SymbolTable.checkForUndefined(Symbol
Table.java:665)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:545
)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.jav
a:518)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.jav
a:495)
        at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:361)
        at java.lang.Thread.run(Thread.java:619)

 

摸不着头脑,搜了网上相应的信息,发现问题还是出在deploy.wldd,其中红色标记处,开始都写成了rtns、或是tns,其实这种错误在浏览wsdl中可以发现,如下图:

 

 

wdsl中xsd的命名空间是xmlns:xsd="http://www.w3.org/2001/XMLSchema",当然报错了。于是将xsd改成当前wsdl的targetNamespace就ok了!!!

 

正确wsdl如下图:

 

 

再次运行java  -Djava.ext.dirs=lib  org.apache.axis.wsdl.WSDL2Java http://localhost:8080/pe-speservice/services/TTL_PETraceAirportData?wsdl

 

一切正常,当前目录下生成如下文件:

 

原创粉丝点击