2010-02-26 2 views
1

Я пытаюсь создать контрактную веб-службу с использованием Apache Axis2 1.4.1. Поскольку Eclipse имеет то, что кажется довольно полным редактором wsdl, я начал авторизовать свои wsdls с помощью редактора Eclipse. Все отлично работает, я могу создавать классы Java, используя wsdl2java и работу веб-служб при развертывании. Однако добавление исключения или ошибки в веб-службу приводит к исключению, говоря, что Element QName имеет значение null для ошибки. Кто-нибудь знает, что может вызвать это? Проверка wsdl также не дает мне прямых ответов. Кажется, что Fault/exception определено точно так же, как и другие элементы.Axis2 Web Services и Eclipse Создание WSDL: добавление ошибки оси в wsdl вызывает исключение при запуске wsdl2java

Here's команды и трассировки стека:

>d:\axis2-1.4.1\bin\wsdl2java.bat -o src-test -ss -uri JavaIntegrationModule.wsdl 
Using AXIS2_HOME: D:\axis2-1.4.1 
Using JAVA_HOME: D:\Java\jdk1.5.0_14 
Retrieving document at 'JavaIntegrationModule.wsdl'. 
[INFO] The src-test\src\org\example\www\javaintegrationmodule\JavaIntegrationModuleSkeleton.java file cannot be overwritten. 
[INFO] The src-test\src\org\example\www\javaintegrationmodule\JavaIntegrationModuleMessageReceiverInOut.java file cannot be overwritten. 
D:\>d:\axis2-1.4.1\bin\wsdl2java.bat -o src-test -ss -uri JavaIntegrationModule.wsdl 
Using AXIS2_HOME: D:\axis2-1.4.1 
Using JAVA_HOME: D:\Java\jdk1.5.0_14 
Retrieving document at 'JavaIntegrationModule.wsdl'. 
D:\>d:\axis2-1.4.1\bin\wsdl2java.bat -o src-test -ss -uri JavaIntegrationModule.wsdl 
Using AXIS2_HOME: D:\axis2-1.4.1 
Using JAVA_HOME: D:\Java\jdk1.5.0_14 
Retrieving document at 'JavaIntegrationModule.wsdl'. 
Exception in thread "main" org.apache.axis2.wsdl.codegen.CodeGenerationException: org.apache.axis2.wsdl.codegen.CodeGenerationException: jav 
a.lang.RuntimeException: Element QName is null for getSolutionByIdFault! 
     at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.generate(CodeGenerationEngine.java:271) 
     at org.apache.axis2.wsdl.WSDL2Code.main(WSDL2Code.java:35) 
     at org.apache.axis2.wsdl.WSDL2Java.main(WSDL2Java.java:24) 
Caused by: org.apache.axis2.wsdl.codegen.CodeGenerationException: java.lang.RuntimeException: Element QName is null for getSolutionByIdFault 
! 
     at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.emitSkeleton(AxisServiceBasedMultiLanguageEmitter.java 
:1370) 
     at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.generate(CodeGenerationEngine.java:253) 
     ... 2 more 
Caused by: java.lang.RuntimeException: Element QName is null for getSolutionByIdFault! 
     at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.getFaultParamElements(AxisServiceBasedMultiLanguageEmi 
tter.java:2829) 
     at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.getFaultElement(AxisServiceBasedMultiLanguageEmitter.j 
ava:2748) 
     at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.generateMethodElement(AxisServiceBasedMultiLanguageEmi 
tter.java:2269) 
     at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.loadOperations(AxisServiceBasedMultiLanguageEmitter.ja 
va:2151) 
     at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.createDOMDocumentForSkeleton(AxisServiceBasedMultiLang 
uageEmitter.java:2065) 
     at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.writeSkeleton(AxisServiceBasedMultiLanguageEmitter.jav 
a:1991) 
     at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.emitSkeleton(AxisServiceBasedMultiLanguageEmitter.java 
:1327) 
     ... 3 more 

и файл WSDL:

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/JavaIntegrationModule/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="JavaIntegrationModule" targetNamespace="http://www.example.org/JavaIntegrationModule/"> 
    <wsdl:types> 
    <xsd:schema targetNamespace="http://www.example.org/JavaIntegrationModule/"> 
     <xsd:element name="getSolutionById"> 
     <xsd:complexType> 
      <xsd:sequence> 
      <xsd:element name="in" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="getSolutionByIdResponse"> 
     <xsd:complexType> 
      <xsd:sequence> 
      <xsd:element name="out" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="getSolutionByIdFault"> 
     <xsd:complexType> 
     <xsd:sequence> 

     <xsd:element name="getSolutionByIdFault" 
      type="xsd:string"> 
     </xsd:element> 
     </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
    </xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="getSolutionByIdRequest"> 
    <wsdl:part element="tns:getSolutionById" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getSolutionByIdResponse"> 
    <wsdl:part element="tns:getSolutionByIdResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getSolutionByIdFault"> 
    <wsdl:part name="parameters" element="tns:getSolutionByIdFault"></wsdl:part> 
    </wsdl:message> 
    <wsdl:portType name="JavaIntegrationModule"> 
    <wsdl:operation name="getSolutionById"> 
     <wsdl:input message="tns:getSolutionByIdRequest"/> 
     <wsdl:output message="tns:getSolutionByIdResponse"/> 
      <wsdl:fault name="fault" message="tns:getSolutionByIdFault"></wsdl:fault> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="JavaIntegrationModuleSOAP" type="tns:JavaIntegrationModule"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="getSolutionById"> 
     <soap:operation soapAction="http://www.example.org/JavaIntegrationModule/getSolutionById"/> 
     <wsdl:input> 
     <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="JavaIntegrationModule"> 
    <wsdl:port binding="tns:JavaIntegrationModuleSOAP" name="JavaIntegrationModuleSOAP"> 
     <soap:address location="http://www.example.org/"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

ответ

6

Я думаю, что я сейчас решил эту себе. Похоже, что по какой-то причине редактор WSDL Eclipse не добавил ошибку в связывающую часть WSDL.

Поэтому, когда я добавил:

<wsdl:fault name="fault"> 
    <soap:fault use="literal" name="fault" /> 
</wsdl:fault> 

к связыванию, он отлично компилируется.

Полный WSDL теперь:

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/JavaIntegrationModule/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="JavaIntegrationModule" targetNamespace="http://www.example.org/JavaIntegrationModule/"> 
    <wsdl:types> 
    <xsd:schema targetNamespace="http://www.example.org/JavaIntegrationModule/"> 
     <xsd:element name="getSolutionById"> 
     <xsd:complexType> 
      <xsd:sequence> 
      <xsd:element name="in" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="getSolutionByIdResponse"> 
     <xsd:complexType> 
      <xsd:sequence> 
      <xsd:element name="out" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="getSolutionByIdFault"> 
     <xsd:complexType> 
     <xsd:sequence> 

     <xsd:element name="getSolutionByIdFault" 
      type="xsd:string"> 
     </xsd:element> 
     </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 

    </xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="getSolutionByIdRequest"> 
    <wsdl:part element="tns:getSolutionById" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getSolutionByIdResponse"> 
    <wsdl:part element="tns:getSolutionByIdResponse" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="getSolutionByIdFault"> 
    <wsdl:part name="parameters" element="tns:getSolutionByIdFault"></wsdl:part> 
    </wsdl:message> 
    <wsdl:portType name="JavaIntegrationModule"> 
    <wsdl:operation name="getSolutionById"> 
     <wsdl:input message="tns:getSolutionByIdRequest"/> 
     <wsdl:output message="tns:getSolutionByIdResponse"/> 

      <wsdl:fault name="fault" message="tns:getSolutionByIdFault"></wsdl:fault> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="JavaIntegrationModuleSOAP" type="tns:JavaIntegrationModule"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="getSolutionById"> 
     <soap:operation soapAction="http://www.example.org/JavaIntegrationModule/getSolutionById"/> 
     <wsdl:input> 
     <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal"/> 
     </wsdl:output> 
     <wsdl:fault name="fault"> 
     <soap:fault use="literal" name="fault" /> 
     </wsdl:fault> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="JavaIntegrationModule"> 
    <wsdl:port binding="tns:JavaIntegrationModuleSOAP" name="JavaIntegrationModuleSOAP"> 
     <soap:address location="http://www.example.org/"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 
2
тоже

Me! Ваше решение сэкономило мне время для оглядки :)

Btw, в Eclipse, когда вы нажимаете на вкладку «Дизайн» для поиска WSDL и выбираете элемент «Связывание», вы можете «генерировать привязывающий контент» автоматически из окна «Свойства». Таким образом, вам не нужно вручную изменять исходный код WSDL.