在基于SOAP的Web服务中访问MuleMessage

时间:2014-02-25 16:27:21

标签: mule

在基于soap的Web服务中,我想访问Mule消息属性。有没有办法这样做我知道使用RequestContext.getEvent()。getMessage()的一种方法,但我猜这是不推荐的。另一种访问Web服务中的MuleMessage属性的方法。有人可以提供任何指示。

代码段

<flow name="MyWebService" doc:name="MyWebService">
    <http:inbound-endpoint exchange-pattern="request-response" address="${WEB_SERVICE_PROTOCOL}://${WEB_SERVICE_HOST}:${WEB_SERVICE_PORT}/MyWebService?wsdl" tracking:enable-default-events="true">
        <cxf:jaxws-service serviceClass="com.XXX.XXX.service.MyWebService" doc:name="SOAP"/>
    </http:inbound-endpoint>
    <component doc:name="My Web Service">
        <spring-object bean="WebServiceImpl"/>
    </component>
</flow>            

3 个答案:

答案 0 :(得分:1)

根据获取消息属性的目的,一个选项是使用cxf拦截器来访问消息。请参阅以下示例。

添加拦截器:

<cxf:jaxws-service serviceClass="org.example.HelloWorld">
   <cxf:inInterceptors>
     <spring:bean class="org.example.MyInterceptor"/>
   </cxf:inInterceptors>
</cxf:jaxws-service>

拦截器类:

package org.example;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.mule.api.MuleEvent;
import org.mule.api.MuleMessage;

public class MyInterceptor extends AbstractSoapInterceptor {

    public MyInterceptor() {
        super(Phase.USER_PROTOCOL);
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
         MuleEvent muleEvent = (MuleEvent)message.getContextualProperty("mule.event");
         MuleMessage muleMessage = muleEvent.getMessage();
         System.out.println(muleMessage.toString());
    }

}

答案 1 :(得分:0)

如果您有权访问MuleMessage,则可以使用方法

获取所需的属性
Set<String> getPropertyNames(PropertyScope scope);

在MuleMessage类中可用。要获取MuleMessage,您需要访问MuleClient;你有权访问MuleClient吗?如果是,则使用:

muleClient = muleContext.getClient();
MuleMessage result = muleClient.send(webaddress, "", props);

这是你想要实现的目标吗?

答案 2 :(得分:0)

您可以通过完全不实现服务接口来实现这一点,并将SOAP请求作为Mule消息(可以访问属性)处理,而不是处理服务类中的反序列化对象。

这是一个示例片段,假设您已经使用wsdl2java从WSDL生成了必要的类和接口:

<flow name="WebServiceFlow">
    <http:inbound-endpoint exchange-pattern="request-response"
        address="http://localhost:8080/services/some" />

    <cxf:jaxws-service
        serviceClass="com.amce.SomePortType" />

    <choice>
        <when
            expression="#[cxf_operation.localPart == 'SomeOperation']">
            <flow-ref name="HandleSomeOperation" />
        </when>