2011-07-27 15 views
6

He estado buscando bibliotecas de cliente SOAP para Java y he encontrado una gran cantidad de bibliotecas basadas en la idea de compilar stubs y clases de proxy basadas en WSDL. Estoy interesado en permitir que el usuario ingrese un WSDL en tiempo de ejecución, analizando el WSDL y luego permitiendo que el usuario realice operaciones en el servicio web.¿Qué es una buena biblioteca de Java para las operaciones dinámicas del cliente SOAP?

¿Alguien sabe de una buena biblioteca de cliente SOAP que permita este uso del tiempo de ejecución? ¿O hay alguna forma de que pueda usar la funcionalidad axis2 wsdl2java para construir stubs en el cargador de clases y usarlos en tiempo de ejecución?

Respuesta

3

Más tarde que nunca. :)

que usted debe lograr que en dos pasos:

  • 1) analizar el WSDL informada por el usuario para recuperar las operaciones disponibles. Consulte this question para saber cómo hacerlo de una manera sencilla.

  • 2) Cree un cliente dinámico para enviar una solicitud utilizando las operaciones seleccionadas. Se puede hacer utilizando la API Dispatch desde Apache CXF.

Construir el objeto Dispatch para el cliente dinámico (Puede ser creado sobre la marcha, informando a punto final de servicios web, nombre de puerto, etc.):

package com.mycompany.demo; 

import javax.xml.namespace.QName; 
import javax.xml.ws.Service; 

public class Client { 
    public static void main(String args[]) { 
    QName serviceName = new QName("http://org.apache.cxf", "stockQuoteReporter"); 
    Service s = Service.create(serviceName); 

    QName portName = new QName("http://org.apache.cxf", "stockQuoteReporterPort"); 
    Dispatch<DOMSource> dispatch = s.createDispatch(portName, 
                DOMSource.class, 
                Service.Mode.PAYLOAD); 
    ... 
    } 
} 

construir el mensaje de solicitud (en el ejemplo a continuación estamos utilizando DOMSource):

// Creating a DOMSource Object for the request 
DocumentBuilder db = DocumentBuilderFactory.newDocumentBuilder(); 
Document requestDoc = db.newDocument(); 
Element root = requestDoc.createElementNS("http://org.apache.cxf/stockExample", "getStockPrice"); 
root.setNodeValue("DOW"); 
DOMSource request = new DOMSource(requestDoc); 

invocar el servicio web

// Dispatch disp created previously 
DOMSource response = dispatch.invoke(request); 

recomendaciones:

  • Uso ((BindingProvider)dispatch).getRequestContext().put("thread.local.request.context", "true"); si usted quiere hacer el hilo objeto de Despacho seguro.
  • Almacenar en caché el objeto Dispatch para usarlo más adelante, si es el caso. El proceso de construir el objeto no es gratis.

Otros métodos

Hay otros métodos para crear clientes dinámicos, como el uso de CXF dynamic-clients API. Se puede leer en la página de índice del proyecto:

CXF soporta varias alternativas para permitir que una aplicación comunicarse con un servicio sin las clases de SEI y datos

no he probado yo mismo, pero debería pena dándole una oportunidad.

-1

puede realizar esta funcionalidad de tipo, pero debe utilizar el mismo tipo de entrada de método y el tipo de devolución para el método de servicio web.

Cuestiones relacionadas