Llamando a servicio web axis2 desde el cliente Xfire: La referencia de punto final (EPR) para la operación que no se encuentra

StackOverflow https://stackoverflow.com/questions/2301548

Pregunta

Tengo que llamar a servicio web axis2 con WS-Security (nombre de usuario token) de Xfire cliente a través de HTTPS. Podría hacer el ejercicio a través de Xfire dinámica cliente , pero no hubo suerte con el cliente de base de WSDL (es decir, generan stub java de WSDL). Podría punto de que nadie me lo podría estar equivocado (talón, WS-Security otra cosa)?

Excepción:

  

Excepción en hilo "principal"   org.codehaus.xfire.XFireRuntimeException:   no puede invocar el servicio .. anidada   excepción es   org.codehaus.xfire.fault.XFireFault:   La referencia de extremo (EPR) para la   La operación no es encontrado    https: // localhost / servicios / DataServiceSample2   y la Acción WSA =   org.codehaus.xfire.fault.XFireFault:   La referencia de extremo (EPR) para la   La operación no es encontrado    https: // localhost / servicios / DataServiceSample2   y la Acción WSA =

Código:

public static void main(String[] args) throws MalformedURLException {
    ProtocolSocketFactory easy = new EasySSLProtocolSocketFactory();
    Protocol protocol = new Protocol("https", easy, 9443);
    Protocol.registerProtocol("https", protocol);

    ObjectServiceFactory serviceFactory = new ObjectServiceFactory();
    serviceFactory.setStyle("message");
    Service serviceModel = serviceFactory.create(DataServiceSample2PortType.class);
    XFireProxyFactory factory = new XFireProxyFactory();
    DataServiceSample2PortType service = (DataServiceSample2PortType) factory.create(serviceModel, "https://localhost:9443/services/DataServiceSample2");
    Client client = Client.getInstance(service);
client.addOutHandler(new DOMOutHandler());

    Properties properties = new Properties();
    properties.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    properties.setProperty(WSHandlerConstants.USER, "admin");
    properties.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
    properties.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());
    client.addOutHandler(new WSS4JOutHandler(properties));

    sab.TopCustomerResponse topCustomersInCalifornia = service.topCustomersInCalifornia(null);
}
¿Fue útil?

Solución 2

Me falta el parámetro "SOAPAction" en el encabezado HTTP. También podemos establecer directamente como

HttpsURLConnection conn;
...
conn.setRequestProperty("SOAPAction", "urn:executeXml");

Que yo sepa en el cliente de Xfire se podría proceder al archivo de tal manera:

    Map m = new HashMap();
    m.put("SOAPAction", "urn:executeXml");
    client.setProperty(CommonsHttpMessageSender.HTTP_HEADERS, m);

Otros consejos

Por favor, intente reemplazar el localhost con la dirección IP de la máquina donde el servicio se está ejecutando. En lugar de

factory.create(serviceModel,"https://localhost:9443/services/DataServiceSample2");

Se puede intentar especificar la dirección IP como esto

factory.create(serviceModel,"https://192.168.2.18:9443/services/DataServiceSample2");

Tenga en cuenta que se considera mala práctica de código de envío con los parámetros ambiguos. Así que después de probarlo tendrá que reemplazar la dirección IP codificado con alguna variable que se puede configurar fácilmente.

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