Вызов веб-сервиса axis2 из клиента xfire:Ссылка на конечную точку (EPR) для операции не найдена.
-
21-09-2019 - |
Вопрос
Мне нужно вызвать веб-службу axis2 с помощью ws-security (токена имени пользователя) из клиента xfire через https.Я мог бы выполнить упражнение через динамический клиент xfire, но с базовым клиентом wsdl не повезло (т.создать заглушку Java из wsdl).Может ли кто-нибудь указать мне, что может быть не так (заглушка, ws-security что-то еще)?
Исключение:
Исключение в потоке "Main" org.codehaus.xfire.xfireruntimeexception:Не удалось вызвать службу..Вложенное исключение - org.codehaus.xfire.fault.xfirefault:Ссылка на конечную точку (EPR) для не найденной операции https://localhost/services/DataServiceSample2и wsa action = org.codehaus.xfire.fault.xfirefault:Ссылка на конечную точку (EPR) для не найденной операции https://localhost/services/DataServiceSample2и действие WSA =
Код:
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);
}
Решение 2
Я скучаю "SOAPAction
"параметр в HTTP-заголовке.Вы можете установить его непосредственно как
HttpsURLConnection conn;
...
conn.setRequestProperty("SOAPAction", "urn:executeXml");
AFAIK в клиенте XFire его можно заархивировать таким образом:
Map m = new HashMap();
m.put("SOAPAction", "urn:executeXml");
client.setProperty(CommonsHttpMessageSender.HTTP_HEADERS, m);
Другие советы
Пожалуйста, попробуйте заменить локальный хост с IP-адресом компьютера, на котором работает ваш сервис.Вместо
factory.create(serviceModel,"https://localhost:9443/services/DataServiceSample2");
Вы можете попробовать указать IP-адрес следующим образом
factory.create(serviceModel,"https://192.168.2.18:9443/services/DataServiceSample2");
Обратите внимание: отправлять код с неоднозначными параметрами считается плохой практикой.Поэтому после тестирования вам нужно будет заменить жестко запрограммированный IP-адрес некоторой переменной, которую можно легко настроить.