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 Protoco开发者_开发问答l("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);
}
Please try replacing the localhost with ip address of the machine where your service is running. Instead of
factory.create(serviceModel,"https://localhost:9443/services/DataServiceSample2");
You can try specifying the ip address like this
factory.create(serviceModel,"https://192.168.2.18:9443/services/DataServiceSample2");
Please note that it is considered bad practice to ship code with ambiguous parameters. So after testing it you will need to replace hard coded ip address with some variable which can be easily configured.
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);
精彩评论