#java #web-services #soap #mule
#java #веб-сервисы #soap #мул
Вопрос:
Я использую Mule 3.5, и у меня есть требование, при котором мне нужно использовать веб-сервис SOAP, для которого авторизация выполняется через авторизованную часть самого URL-адреса.
Я не контролирую этот API и, следовательно, не могу его изменить.URL-адрес будет выглядеть примерно так, как показано ниже
https://2james:Mdops@allscripts/HWS61/ClinicalInfo.svc
Где имя пользователя — 2james, а пароль — Mdops.
Имя пользователя и пароль будут переданы потоку mule, после чего мне нужно подключиться к веб-сервису SOAP.
Документация Mule здесь (раздел «шпаргалка») объясняет, как свойства сообщения можно использовать для настройки исходящего URL-адреса http.
<https:outbound-endpoint address="https://#[message.inboundProperties.username]:#[message.inboundProperties.password]@api.acme.com/v1/users" />
Мне нужно иметь аналогичную функциональность с моим потребителем WS, когда я пытаюсь выполнить сбой этого мула при запуске, жалуясь, что он не может проанализировать URI, моя конфигурация выглядит следующим образом
<ws:consumer-config name="Web_Service_Consumer" wsdlLocation="Authentication.wsdl" service="Authentication" port="BasicHttpBinding_IAuthentication" serviceAddress="https://2james:Mdops@localhost:443/HWS61/Authentication.svc" doc:name="Web Service Consumer" connector-ref="HTTP_HTTPS">
</ws:consumer-config>
<flow name="testFlow1" doc:name="testFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" mimeType="application/json" contentType="application/json" />
<ws:consumer config-ref="Web_Service_Consumer" operation="Logon" doc:name="Authentication" />
</flow>
Если я изменю ws: consumer-config для использования свойств сообщения, Mule не запускается с приведенным ниже исключением
ERROR 2014-06-24 15:53:46,771 [main] org.mule.module.launcher.application.DefaultMuleApplication: null
java.lang.NullPointerException
at org.mule.endpoint.MuleEndpointURI.getScheme(MuleEndpointURI.java:331)
at org.mule.module.ws.consumer.WSConsumerConfig.createOutboundEndpoint(WSConsumerConfig.java:50)
at org.mule.module.ws.consumer.WSConsumer.createMessageProcessor(WSConsumer.java:230)
at org.mule.module.ws.consumer.WSConsumer.initialise(WSConsumer.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1612)
**
Обновить
**
Как указано ниже, веб-потребитель может работать с динамическими свойствами, однако проблема возникает, когда потребитель WS ссылается на HTTP-соединитель. Причина, по которой я должен был это сделать, заключается в том, что SOAP WS зависит от хранилища доверия для аутентификации, хранилище доверия может быть настроено только через HTTP-соединитель.
Итак, мой обновленный потребитель WS выглядит следующим образом.
<ws:consumer-config serviceAddress="https://#[message.payload]:#[message.payload]@localhost:${port}/#[message.inboundProperties['path']]" wsdlLocation="Authentication.wsdl"
service="Authentication" port="BasicHttpBinding_IAuthentication" name="Web_Service_Consumer" connector-ref="HTTP_HTTPS"/>
<https:connector name="HTTP_HTTPS" cookieSpec="netscape" validateConnections="true" sendBufferSize="0" receiveBufferSize="0" receiveBacklog="0" clientSoTimeout="10000" serverSoTimeout="10000" socketSoLinger="0" doc:name="HTTP-HTTPS" >
<https:tls-server path="E:AppServerclient-truststore.jks" storePassword="welcome" explicitOnly="true" requireClientAuthentication="true" />
</https:connector>
Комментарии:
1. Я решил свою проблему. Для начала удалите ссылку на HTTP-соединитель из WS consumer. Добавьте сертификат в хранилище доверия JDK, если это неприемлемо, затем используйте компонент непосредственно перед потребителем ws, чтобы задать сведения о хранилище доверия в системных свойствах, и потребитель WS будет использовать его автоматически. Если кто-то сталкивается с такой же проблемой и не может решить, просто напишите мне.
Ответ №1:
У вас может быть динамический адрес, как показано здесь: https://github.com/mulesoft/mule/blob/c88dbfecc98e5586ee100185082c411ebb0d0f16/modules/ws/src/test/resources/dynamic-address-config.xml
Он жалуется, что в нем отсутствует схема, поэтому не могли бы вы опубликовать конфигурацию для конфигурации wsconsumer с динамическим адресом?
Должно работать следующее:
<ws:consumer-config name="Web_Service_Consumer" wsdlLocation="Authentication.wsdl" service="Authentication" port="BasicHttpBinding_IAuthentication" serviceAddress="https://#[message.inboundProperties.username]:#[message.inboundProperties.password]@localhost:443/HWS61/Authentication.svc" doc:name="Web Service Consumer" connector-ref="HTTP_HTTPS">
</ws:consumer-config>
Комментарии:
1. Спасибо за этот ответ, и да, это так, я дополнительно обновил свой вопрос, чтобы отразить мой точный сценарий, я не вдавался в подробности, думая, что это не имеет значения