2012-03-22 85 views
0

我正嘗試使用wsdl2java生成客戶端。該WSDL如下所示:使用Axis2 wsdl2java生成的異常類不會擴展異常

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions targetNamespace="http://admin.ws.csd.rsa.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://admin.ws.csd.rsa.com" xmlns:intf="http://admin.ws.csd.rsa.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <!--WSDL created by Apache Axis version: 1.4 
    Built on Apr 22, 2006 (06:55:48 PDT)--> 
    <wsdl:types> 
     <schema elementFormDefault="qualified" targetNamespace="http://admin.ws.csd.rsa.com" xmlns="http://www.w3.org/2001/XMLSchema"> 
      <element name="getUserStatus"> 
       <complexType> 
        <sequence> 
         <element name="in0" type="impl:AdminRequest"/> 
        </sequence> 
       </complexType> 
      </element> 
      <complexType name="GenericRequest"> 
       <sequence> 
        <element name="adminID" nillable="true" type="xsd:string"/> 
        <element name="orgName" nillable="true" type="xsd:string"/> 
        <element name="userName" nillable="true" type="xsd:string"/> 
       </sequence> 
      </complexType> 
      <complexType name="AdminRequest"> 
       <complexContent> 
        <extension base="impl:GenericRequest"> 
         <sequence> 
          <element name="userStatus" nillable="true" type="xsd:string"/> 
         </sequence> 
        </extension> 
       </complexContent> 
      </complexType> 
      <element name="getUserStatusResponse"> 
       <complexType> 
        <sequence> 
         <element name="getUserStatusReturn" type="impl:AdminResponse"/> 
        </sequence> 
       </complexType> 
      </element> 
      <complexType name="GenericResponse"> 
       <sequence> 
        <element name="status" nillable="true" type="xsd:string"/> 
       </sequence> 
      </complexType> 
      <complexType name="UserChange"> 
       <sequence> 
        <element name="date" nillable="true" type="xsd:string"/> 
        <element name="description" nillable="true" type="xsd:string"/> 
        <element name="type" nillable="true" type="xsd:string"/> 
       </sequence> 
      </complexType> 
      <complexType name="ArrayOfUserChange"> 
       <sequence> 
        <element maxOccurs="unbounded" minOccurs="0" name="userChangeHistory" type="impl:UserChange"/> 
       </sequence> 
      </complexType> 
      <complexType name="AdminResponse"> 
       <complexContent> 
        <extension base="impl:GenericResponse"> 
         <sequence> 
          <element name="userChangeHistory" nillable="true" type="impl:ArrayOfUserChange"/> 
          <element name="userStatus" nillable="true" type="xsd:string"/> 
         </sequence> 
        </extension> 
       </complexContent> 
      </complexType> 
      <complexType name="AdminServiceException"> 
       <sequence/> 
      </complexType> 
      <element name="fault" type="impl:AdminServiceException"/> 
      <element name="unlockUser"> 
       <complexType> 
        <sequence> 
         <element name="in0" type="impl:AdminRequest"/> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="unlockUserResponse"> 
       <complexType> 
        <sequence> 
         <element name="unlockUserReturn" type="impl:AdminResponse"/> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="deleteUser"> 
       <complexType> 
        <sequence> 
         <element name="in0" type="impl:AdminRequest"/> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="deleteUserResponse"> 
       <complexType> 
        <sequence> 
         <element name="deleteUserReturn" type="impl:AdminResponse"/> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="getUserChangeHistory"> 
       <complexType> 
        <sequence> 
         <element name="in0" type="impl:AdminRequest"/> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="getUserChangeHistoryResponse"> 
       <complexType> 
        <sequence> 
         <element name="getUserChangeHistoryReturn" type="impl:AdminResponse"/> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="lockUser"> 
       <complexType> 
        <sequence> 
         <element name="in0" type="impl:AdminRequest"/> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="lockUserResponse"> 
       <complexType> 
        <sequence> 
         <element name="lockUserReturn" type="impl:AdminResponse"/> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="setUserStatus"> 
       <complexType> 
        <sequence> 
         <element name="in0" type="impl:AdminRequest"/> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="setUserStatusResponse"> 
       <complexType> 
        <sequence> 
         <element name="setUserStatusReturn" type="impl:AdminResponse"/> 
        </sequence> 
       </complexType> 
      </element> 
     </schema> 
    </wsdl:types> 
    <wsdl:message name="lockUserRequest"> 
     <wsdl:part element="impl:lockUser" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="unlockUserRequest"> 
     <wsdl:part element="impl:unlockUser" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="setUserStatusRequest"> 
     <wsdl:part element="impl:setUserStatus" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getUserStatusResponse"> 
     <wsdl:part element="impl:getUserStatusResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getUserStatusRequest"> 
     <wsdl:part element="impl:getUserStatus" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getUserChangeHistoryResponse"> 
     <wsdl:part element="impl:getUserChangeHistoryResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getUserChangeHistoryRequest"> 
     <wsdl:part element="impl:getUserChangeHistory" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="AdminServiceException"> 
     <wsdl:part element="impl:fault" name="fault"/> 
    </wsdl:message> 
    <wsdl:message name="lockUserResponse"> 
     <wsdl:part element="impl:lockUserResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="deleteUserRequest"> 
     <wsdl:part element="impl:deleteUser" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="deleteUserResponse"> 
     <wsdl:part element="impl:deleteUserResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="unlockUserResponse"> 
     <wsdl:part element="impl:unlockUserResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="setUserStatusResponse"> 
     <wsdl:part element="impl:setUserStatusResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:portType name="UserAdminService"> 
     <wsdl:operation name="getUserStatus"> 
      <wsdl:input message="impl:getUserStatusRequest" name="getUserStatusRequest"/> 
      <wsdl:output message="impl:getUserStatusResponse" name="getUserStatusResponse"/> 
      <wsdl:fault message="impl:AdminServiceException" name="AdminServiceException"/> 
     </wsdl:operation> 
     <wsdl:operation name="unlockUser"> 
      <wsdl:input message="impl:unlockUserRequest" name="unlockUserRequest"/> 
      <wsdl:output message="impl:unlockUserResponse" name="unlockUserResponse"/> 
      <wsdl:fault message="impl:AdminServiceException" name="AdminServiceException"/> 
     </wsdl:operation> 
     <wsdl:operation name="deleteUser"> 
      <wsdl:input message="impl:deleteUserRequest" name="deleteUserRequest"/> 
      <wsdl:output message="impl:deleteUserResponse" name="deleteUserResponse"/> 
      <wsdl:fault message="impl:AdminServiceException" name="AdminServiceException"/> 
     </wsdl:operation> 
     <wsdl:operation name="getUserChangeHistory"> 
      <wsdl:input message="impl:getUserChangeHistoryRequest" name="getUserChangeHistoryRequest"/> 
      <wsdl:output message="impl:getUserChangeHistoryResponse" name="getUserChangeHistoryResponse"/> 
      <wsdl:fault message="impl:AdminServiceException" name="AdminServiceException"/> 
     </wsdl:operation> 
     <wsdl:operation name="lockUser"> 
      <wsdl:input message="impl:lockUserRequest" name="lockUserRequest"/> 
      <wsdl:output message="impl:lockUserResponse" name="lockUserResponse"/> 
      <wsdl:fault message="impl:AdminServiceException" name="AdminServiceException"/> 
     </wsdl:operation> 
     <wsdl:operation name="setUserStatus"> 
      <wsdl:input message="impl:setUserStatusRequest" name="setUserStatusRequest"/> 
      <wsdl:output message="impl:setUserStatusResponse" name="setUserStatusResponse"/> 
      <wsdl:fault message="impl:AdminServiceException" name="AdminServiceException"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="AdaptiveAuthenticationAdminSoapBinding" type="impl:UserAdminService"> 
     <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="getUserStatus"> 
      <wsdlsoap:operation soapAction=""/> 
      <wsdl:input name="getUserStatusRequest"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output name="getUserStatusResponse"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="AdminServiceException"> 
       <wsdlsoap:fault name="AdminServiceException" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 
     <wsdl:operation name="unlockUser"> 
      <wsdlsoap:operation soapAction=""/> 
      <wsdl:input name="unlockUserRequest"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output name="unlockUserResponse"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="AdminServiceException"> 
       <wsdlsoap:fault name="AdminServiceException" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 
     <wsdl:operation name="deleteUser"> 
      <wsdlsoap:operation soapAction=""/> 
      <wsdl:input name="deleteUserRequest"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output name="deleteUserResponse"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="AdminServiceException"> 
       <wsdlsoap:fault name="AdminServiceException" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 
     <wsdl:operation name="getUserChangeHistory"> 
      <wsdlsoap:operation soapAction=""/> 
      <wsdl:input name="getUserChangeHistoryRequest"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output name="getUserChangeHistoryResponse"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="AdminServiceException"> 
       <wsdlsoap:fault name="AdminServiceException" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 
     <wsdl:operation name="lockUser"> 
      <wsdlsoap:operation soapAction=""/> 
      <wsdl:input name="lockUserRequest"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output name="lockUserResponse"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="AdminServiceException"> 
       <wsdlsoap:fault name="AdminServiceException" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 
     <wsdl:operation name="setUserStatus"> 
      <wsdlsoap:operation soapAction=""/> 
      <wsdl:input name="setUserStatusRequest"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output name="setUserStatusResponse"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="AdminServiceException"> 
       <wsdlsoap:fault name="AdminServiceException" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="UserAdminServiceService"> 
     <wsdl:port binding="impl:AdaptiveAuthenticationAdminSoapBinding" name="AdaptiveAuthenticationAdmin"> 
      <wsdlsoap:address location="http://myserver:83/AdaptiveAuthenticationAdmin/services/AdaptiveAuthenticationAdmin"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

如果想解壓類(使用選項-u)我發現這個問題,類AdminServiceException不擴展java.lang.Exception的,因此沒有按代碼不能編譯,因爲它不能拋出該類。因此,情況是這樣的:

如果我包中的類(無選項-u),類定義如下:

public class AdminServiceException extends java.lang.Exception{....} 

,但如果我使用選項-u,生成類作爲如下:

public class AdminServiceException 
    implements org.apache.axis2.databinding.ADBBean{....} 

這是不正確的,因爲它不能被拋出。有任何想法嗎?

編輯:

我剛剛修改了WSDL,使其更簡單。這是如下:

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions targetNamespace="http://admin.ws.csd.rsa.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://admin.ws.csd.rsa.com" xmlns:intf="http://admin.ws.csd.rsa.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <!--WSDL created by Apache Axis version: 1.4 
    Built on Apr 22, 2006 (06:55:48 PDT)--> 
    <wsdl:types> 
     <schema elementFormDefault="qualified" targetNamespace="http://admin.ws.csd.rsa.com" xmlns="http://www.w3.org/2001/XMLSchema"> 

      <element name="myRequest"> 
       <complexType> 
        <sequence> 
         <element name="userName" nillable="true" type="xsd:string"/> 
        </sequence> 
       </complexType> 
      </element> 

      <element name="myResponse"> 
       <complexType> 
        <sequence> 
         <element name="userStatus" nillable="true" type="xsd:string"/> 
        </sequence> 
       </complexType> 
      </element> 

      <complexType name="AdminServiceException"> 
       <sequence/> 
      </complexType> 
      <element name="fault" type="impl:AdminServiceException"/> 

     </schema> 
    </wsdl:types> 

    <wsdl:message name="getUserStatusResponse"> 
     <wsdl:part element="impl:myResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getUserStatusRequest"> 
     <wsdl:part element="impl:myRequest" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="AdminServiceException"> 
     <wsdl:part element="impl:fault" name="fault"/> 
    </wsdl:message> 

    <wsdl:portType name="UserAdminService"> 
     <wsdl:operation name="getUserStatus"> 
      <wsdl:input message="impl:getUserStatusRequest" name="getUserStatusRequest"/> 
      <wsdl:output message="impl:getUserStatusResponse" name="getUserStatusResponse"/> 
      <wsdl:fault message="impl:AdminServiceException" name="AdminServiceException"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="AdaptiveAuthenticationAdminSoapBinding" type="impl:UserAdminService"> 
     <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="getUserStatus"> 
      <wsdlsoap:operation soapAction=""/> 
      <wsdl:input name="getUserStatusRequest"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output name="getUserStatusResponse"> 
       <wsdlsoap:body use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="AdminServiceException"> 
       <wsdlsoap:fault name="AdminServiceException" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 

    </wsdl:binding> 
    <wsdl:service name="UserAdminServiceService"> 
     <wsdl:port binding="impl:AdaptiveAuthenticationAdminSoapBinding" name="AdaptiveAuthenticationAdmin"> 
      <wsdlsoap:address location="http://server:83/AdaptiveAuthenticationAdmin/services/AdaptiveAuthenticationAdmin"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

我使用的WSDL2Java如下創建的代碼:

/opt/eco/ecoprd/axis2-1.6.1/bin >> ./wsdl2java.sh -u -uri test2.wsdl -or 
Using AXIS2_HOME: /opt/eco/ecoprd/axis2-1.6.1 
Using JAVA_HOME: /usr/local/jdk1.6.0_16 
Retrieving document at 'test2.wsdl'. 

但是當我嘗試編譯代碼:

/opt/eco/ecoprd/axis2-1.6.1/bin >> javac -cp $CLASSPATH src/com/rsa/csd/ws/admin/*.java 
src/com/rsa/csd/ws/admin/Fault.java:95: cannot find symbol 
symbol : method serialize(javax.xml.namespace.QName,javax.xml.stream.XMLStreamWriter) 
location: class com.rsa.csd.ws.admin.AdminServiceException 
           localFault.serialize(MY_QNAME,xmlWriter); 
             ^
src/com/rsa/csd/ws/admin/Fault.java:278: cannot find symbol 
symbol : method getPullParser(javax.xml.namespace.QName) 
location: class com.rsa.csd.ws.admin.AdminServiceException 
       return localFault.getPullParser(MY_QNAME); 
           ^
src/com/rsa/csd/ws/admin/Fault.java:326: cannot find symbol 
symbol : variable Factory 
location: class com.rsa.csd.ws.admin.AdminServiceException 
               object.setFault(com.rsa.csd.ws.admin.AdminServiceException.Factory.parse(reader)); 
                             ^
src/com/rsa/csd/ws/admin/ExtensionMapper.java:28: cannot find symbol 
symbol : variable Factory 
location: class com.rsa.csd.ws.admin.AdminServiceException 
          return com.rsa.csd.ws.admin.AdminServiceException.Factory.parse(reader); 
                      ^
Note: src/com/rsa/csd/ws/admin/UserAdminServiceServiceStub.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
4 errors 

回答

0

我嘗試使用Eclipse IDE生成第二個wsdl的客戶端。它生成並編譯得很好。這意味着wsdl很好。 生成AdminServiceException.java

public class AdminServiceException extends java.lang.Exception{ 

    private static final long serialVersionUID = 1333311238212L; 

    private com.rsa.csd.ws.admin.UserAdminServiceServiceStub.Fault faultMessage; 


     public AdminServiceException() { 
      super("AdminServiceException"); 
     } 

     public AdminServiceException(java.lang.String s) { 
      super(s); 
     } 

     public AdminServiceException(java.lang.String s, java.lang.Throwable ex) { 
      super(s, ex); 
     } 

     public AdminServiceException(java.lang.Throwable cause) { 
      super(cause); 
     } 


    public void setFaultMessage(com.rsa.csd.ws.admin.UserAdminServiceServiceStub.Fault msg){ 
     faultMessage = msg; 
    } 

    public com.rsa.csd.ws.admin.UserAdminServiceServiceStub.Fault getFaultMessage(){ 
     return faultMessage; 
    } 
} 

用於命令行:./wsdl2java.sh -g -ssi -uri test2.wsdl 你不必提-u,就會產生獨立用於實現綁定的數據綁定的類。

+0

好吧,它爲數據綁定創建了內部類,它們編譯得很好。但是,如果我使用-u爲數據綁定生成非內部類,爲什麼它不起作用?這是我不明白的。 – 2012-04-01 22:25:41

0

wsdl2java應該已經產生了一個框架類和/或服務類的接口。檢查框架以瞭解相關的服務功能是如何聲明的。你可能會發現他們被宣佈拋出類似AdminServiceExceptionException的東西。出於某種原因,Axis2根據WSDL中故障的定義創建一個類,然後創建另一個類,擴展Exception作爲第一個類的容器。

+0

我正在生成客戶端,而不是服務器端。 – 2012-03-22 19:49:21

+0

我錯過了。在客戶端,查看存根中相關函數的定義。你可能會發現它們被定義爲拋出'RemoteException'和'AdminServiceExceptionException'。 – Kenster 2012-03-22 20:01:10

+0

是的,客戶端類應該拋出「java.rmi.RemoteException,com.rsa.csd.ws.admin.AdminServiceException;」。但是由於AdminServiceException不會擴展java.lang.Exception,因此代碼不能編譯。這就是問題 – 2012-03-22 20:09:59

0

就在你使用JAXB數據綁定(JAXBRI)的情況下,你必須確保你的WSDL:消息名稱(AdminServiceException)在下列元素:

<wsdl:message name="AdminServiceException"> 
     <wsdl:part element="impl:fault" name="fault"/> 
</wsdl:message> 

是元素名稱(implement執行不同:故障)。就你而言,他們實際上是不同的。

否則你會得到你的「AdminServiceException不擴展java.lang.Exception」錯誤。