Chiamando servizio web axis2 dal client XFire: Il riferimento endpoint (EPR) per l'operazione non trovata
-
21-09-2019 - |
Domanda
Ho bisogno di chiamare il servizio web axis2 con WS-Security (Token nome utente) da Xfire client tramite HTTPS. Ho potuto fare l'esercizio tramite xfire dinamica cliente , ma senza fortuna con client di base WSDL (cioè generare java stub da WSDL). Qualcuno mi potrebbe sottolineare quello che potrebbe essere sbagliato (cosa stub, WS-Security altro)?
Eccezione:
Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Impossibile richiamare il servizio .. annidata eccezione è org.codehaus.xfire.fault.XFireFault: Il riferimento endpoint (EPR) per la Il funzionamento non è trovata https: // localhost / servizi / DataServiceSample2 e il WSA Action = org.codehaus.xfire.fault.XFireFault: Il riferimento endpoint (EPR) per la Il funzionamento non è trovata https: // localhost / servizi / DataServiceSample2 e l'azione WSA =
Codice:
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);
}
Soluzione 2
mi manca il parametro "SOAPAction
" nell'intestazione HTTP. È possibile impostare direttamente come
HttpsURLConnection conn;
...
conn.setRequestProperty("SOAPAction", "urn:executeXml");
Per quanto ne sappia client XFire potrebbe essere archiviata in modo:
Map m = new HashMap();
m.put("SOAPAction", "urn:executeXml");
client.setProperty(CommonsHttpMessageSender.HTTP_HEADERS, m);
Altri suggerimenti
Si prega di provare a sostituire il localhost con l'indirizzo IP della macchina in cui il servizio è in esecuzione. Invece di
factory.create(serviceModel,"https://localhost:9443/services/DataServiceSample2");
Si può provare a specificare l'indirizzo IP come questo
factory.create(serviceModel,"https://192.168.2.18:9443/services/DataServiceSample2");
Si prega di notare che è considerato cattiva pratica di spedire il codice con i parametri ambigui. Così, dopo il test ti sarà necessario sostituire l'indirizzo IP codificato duro con qualche variabile che può essere facilmente configurato.