Llamando a servicio web axis2 desde el cliente Xfire: La referencia de punto final (EPR) para la operación que no se encuentra
-
21-09-2019 - |
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);
}
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.