ws消费者服务地址中的动态属性

时间:2014-06-24 10:24:14

标签: java web-services soap mule

我正在使用Mule 3.5并且需要使用SOAP Web服务,需要通过URL本身的authority part进行授权。

我无法控制此API,因此无法更改它。网址如下所示

https://2james:Mdops@allscripts/HWS61/ClinicalInfo.svc

其中,用户名为2james,密码为Mdops。

用户名和密码将被传递到mule流程,之后我需要连接到SOAP Web服务。

Mule文档here,(备忘单部分)解释了如何使用消息属性来自定义http出站URL。

<https:outbound-endpoint address="https://#[message.inboundProperties.username]:#[message.inboundProperties.password]@api.acme.com/v1/users" />

我需要与我的WS消费者具有类似的功能,当我尝试这个Mule在启动时失败抱怨它无法解析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)

**

更新

**

如下所述,Web使用者可以使用动态属性,但是当WS Consumer引用HTTP连接器时会出现问题。我必须这样做的原因是因为SOAP WS依赖于信任库进行身份验证,信任存储只能通过HTTP连接器进行配置。

所以我更新的WS Consumer看起来像这样。

<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:\AppServer\client-truststore.jks" storePassword="welcome" explicitOnly="true" requireClientAuthentication="true" />
    </https:connector>

1 个答案:

答案 0 :(得分:3)

您可以拥有动态地址,如下所示: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>