style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Cambiar endpoint dinamicamente en cliente de webservice

Estimados, cómo están?

Acabo de generar las clases para consumir un WS, con jax-ws. Ahora bien, tengo la url del servicio, pero existen dos ambientes (uno de certificación y otro de producción) y lo que no sé es cómo cambiar el endpoint del servicio de manera dinámica o pasandolo por parametro.

Esta es mi clase:

@WebServiceClient(name = "SessionCreateRQService")
public class SessionCreateRQService
    extends Service
{

    private final static URL SESSIONCREATERQSERVICE_WSDL_LOCATION;
    private final static WebServiceException SESSIONCREATERQSERVICE_EXCEPTION;
    private final static QName SESSIONCREATERQSERVICE_QNAME = new QName("https://webservices.sabre.com/websvc", "SessionCreateRQService");

    static {
        URL url = null;
        WebServiceException e = null;
        try {
            url = new URL("http://.../servicio.wsdl");
           
        } catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
        }
        SESSIONCREATERQSERVICE_WSDL_LOCATION = url;
        SESSIONCREATERQSERVICE_EXCEPTION = e;
    }

    public SessionCreateRQService() {
        super(__getWsdlLocation(), SESSIONCREATERQSERVICE_QNAME);
    }

    public SessionCreateRQService(URL wsdlLocation) {
        super(wsdlLocation, SESSIONCREATERQSERVICE_QNAME);
    }
   
    public SessionCreateRQService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    /**
     *
     * @return
     *     returns SessionCreatePortType
     */

    @WebEndpoint(name = "SessionCreatePortType")
    public SessionCreatePortType getSessionCreatePortType() {
        return super.getPort(new QName("https://webservices.sabre.com/websvc", "SessionCreatePortType"), SessionCreatePortType.class);
    }

    @WebEndpoint(name = "SessionCreatePortType")
    public SessionCreatePortType getSessionCreatePortType(WebServiceFeature... features) {
        return super.getPort(new QName("https://webservices.sabre.com/websvc", "SessionCreatePortType"), SessionCreatePortType.class, features);       
    }

    private static URL __getWsdlLocation() {
        if (SESSIONCREATERQSERVICE_EXCEPTION!= null) {
            throw SESSIONCREATERQSERVICE_EXCEPTION;
        }
        return SESSIONCREATERQSERVICE_WSDL_LOCATION;
    }

}

Por defenco queda con el endpoint productivo: https://webservices.sabre.com/websvc pero necesito que se apunte al de certificación cuando yo lo requiera: https://sws-crt.cert.sabre.com

Cómo puedo lograr esto? gracias desde ya

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Re: cambiar endpoint dinamicamente

¿Te refieres a algo como lo siguiente?:

SessionCreateRQService service = new SessionCreateRQService();
SessionCreatePortType port = service.getSessionCreatePortType();
BindingProvider bindingProvider = (BindingProvider) port;
Map<String, Object> requestContext = bindingProvider.getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://sws-crt.cert.sabre.com/");

Si

algo como eso...

-pero el seteo de la property debería ser antes de new SessionCreateRQService()???

-getRequestContext() este método de donde lo saco??

Estos métodos estarían correctos?

   @WebEndpoint(name = "SessionCreatePortType")
    public SessionCreatePortType getSessionCreatePortType() {
        return super.getPort(new QName("https://webservices.sabre.com/websvc", "SessionCreatePortType"), SessionCreatePortType.class);
    }
    @WebEndpoint(name = "SessionCreatePortType")
    public SessionCreatePortType getSessionCreatePortType(WebServiceFeature... features) {
        return super.getPort(new QName("https://webservices.sabre.com/websvc", "SessionCreatePortType"), SessionCreatePortType.class, features);        
    }

Saludos

Re: sí

pero el seteo de la property debería ser antes de new SessionCreateRQService()???

No es que debería, pero podría ser antes.

URL url = new URL(wsdlPath);
QName qName = new QName(
    "https://webservices.sabre.com/websvc",
    "SessionCreatePortType"
);
SessionCreateRQService service = new SessionCreateRQService(url, qName);

Donde el endpoint del archivo WSDL en wsdlPath apunta al endpoint deseado. Es decir, tendrías que tener dos archivos WSDL. Pero tú no quieres eso, ¿o sí?

getRequestContext() este método de donde lo saco??

Fue un typo. >.< Corregido. ¡Ja!

Estos métodos estarían correctos? …

Sí, están bien. Don’t worry! Una cosa es el espacio de nombres (en los QName) y otra distinta es el endpoint.

Excelente

Muchas gracias..me sirvió mucho.

Saludos

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">