Pregunta

Me estoy convirtiendo algunos servicios de Apache SOAP para Axis2, por lo que ya existen las clases de servicio de Java. He creado un nuevo proyecto en Eclipse, importó la fuente, se aseguró de que se instalaron las facetas del proyecto Axis2 y Axis2 emisor propiedades son correctos. Luego, en Eclipse, he seleccionado la clase de servicio y elegimos "Crear Web Service", elegir el tiempo de ejecución Axis2. El servicio está en marcha y funcionando en mi PC, y cuando añado "? Wsdl" a la ruta del servicio, que consigue de hecho un WSDL que puedo guardar localmente. Intentar importar esto en SoapUI para construir un cliente da el error:

ERROR:org.apache.xmlbeans.XmlException: C:\projects\soapUI\Axis2\DALService.wsdl:0: error: src-resolve: type 'SOAPException@http://www.w3.org/2001/XMLSchema' not found.

El tipo que se está refiriendo a (SOAPException) es un vestigio de los servicios SOAP Apache, y en el código de servicio, he cambiado todas las referencias de "importación" en el código de servicio (no el WSDL) de org.apache.soap.SOAPException (el antiguo paquete Apache SOAP nombrar) a javax.xml.soap.SOAPException (la ubicación Axis2). El código se compila y funciona, una vez que pueda acceder a él, pero no puede acceder a ella sin generar un cliente. ¿Alguna idea de por qué cambiar el espacio de nombres de un objeto mantendría a los WSDL generados a partir de tener las referencias de espacio de nombres adecuado?

¿Fue útil?

Solución 2

Voy a ser el primero en decir que no tengo idea de por qué nada de esto es el caso, pero yo creo que es el contenido exacto del espacio de nombres puede no importar tanto tiempo, ya que todos son iguales. Ni siquiera estamos utilizando todas las características especiales de SOAPException, ya que sólo se extiende a ciegas la excepción regular. De todos modos, yo era capaz de conseguir SoapUI para construir los clientes desde el XML haciendo tres cosas.

En primer lugar, añadí una sección para representar el propio SOAPException, como así:

    <xs:schema xmlns:test="http://service.PROJECT.DEPARTMENT.COMPANY.com" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://DEPARTMENT.COMPANY.com/xsd">
        <xs:import namespace="http://service.PROJECT.DEPARTMENT.COMPANY.com"/>
        <xs:complexType name="SOAPException">
            <xs:complexContent>
                <xs:extension base="ns:Exception">
                    <xs:sequence/>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:schema>

En segundo lugar, añade el siguiente espacio de nombres para el WSDL: definiciones de bloque:

xmlns:im="http://DEPARTMENT.COMPANY.com/xsd"

En tercer lugar, he cambiado el espacio de nombres referenciado al tipo base SOAPException (Fron ns a im aquí) donde quiera que se ha hecho referencia anteriormente:

    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.ims.im.sa.homedepot.com/xsd">
        <xs:complexType name="SOAPLocatorException">
            <xs:complexContent>
                <xs:extension base="im:SOAPException">
                    <xs:sequence>
                        <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
                        <xs:element minOccurs="0" name="messageCode" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:schema>

El archivo XML aún no valida limpiamente en XMLSpy, pero sólo por una razón más esotérico que no me afecta directamente (las operaciones que tengan defectos definidos para los enlaces Soap11 y soap12, no tienen defectos definido para los enlaces HTTP primas).

A pesar de que funciona, todavía estoy un poco confundido acerca de lo siguiente:

  • Si Axis2 sabía de la SOAPException escribir (y así fue, porque mencionado como la clase base de la otras excepciones), ¿por qué no lo hizo definirlo en un bloque xs:schema?
  • En ese mismo sentido, ¿por qué lo hizo referencia a la clase de un incorrecto espacio de nombres cuando se utiliza como la base clase para otro tipo?
  • ¿Por qué tengo que establecer un espacio de nombres para este tipo como DEPARTMENT.COMPANY.com y no sea un paquete o Axis2 el paquete del objeto de servicio que lo utiliza?

Otros consejos

Sólo tiene que utilizar el "xxx? Wsdl" URL de la cual se presentó el WSDL directamente en la interfaz de usuario de SOAP, parece que algunos esquemas XSD que se hace referencia en el WSDL no están siendo encontrados por la herramienta de SOAP UI, por lo general buscan estas herramientas el esquema de la misma carpeta, también como usted tiene org.apache.soap.SOAPException a javax.xml.soap.SOAPException, esto podría haber cambiado el espacio de nombres.

Sólo trate de usar la URL completa y ver el resultado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top