wsdl2java "XXX is referenced but not defined."解決辦法

   最近又開始研究使用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

 

一切正常,當前目錄下生成如下文件:

 

發佈了17 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章