Chiamando servizio web axis2 dal client XFire: Il riferimento endpoint (EPR) per l'operazione non trovata

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

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);
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top