javaweb-servicesapache-axisws-securityxfire

Calling axis2 web service from xfire client: The endpoint reference (EPR) for the Operation not found


I need to call axis2 web service with ws-security (username token) from xfire client over https. I could do the exercise via xfire dynamic client, but no luck with wsdl base client (i.e. generate java stub from wsdl). Could anybody point me out what could be wrong (stub, ws-security something else)?

Exception:

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: The endpoint reference (EPR) for the Operation not found is https://localhost/services/DataServiceSample2 and the WSA Action = org.codehaus.xfire.fault.XFireFault: The endpoint reference (EPR) for the Operation not found is https://localhost/services/DataServiceSample2 and the WSA Action =

Code:

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);
}

Solution

  • I'm missing "SOAPAction" parameter in HTTP header. You could set it directly as

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

    AFAIK in XFire client it could be archived in such way:

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