2014-02-25 129 views
0

在基于soap的web服务中,我想访问Mule消息属性。有没有这样做的方式,我知道使用RequestContext.getEvent()。getMessage()的一种方式,但我猜这是弃用。访问Web服务中的MuleMessage属性的另一种方式。有人可以提供任何关于此的指针。访问基于soap的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>    

回答

0

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

下面是一个例子片断,假设你已经生成从WSDL必要的类和接口的WSDL2Java:

<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> 
+0

只给一个想法我的web服务有一个接口,如图所示above.I的实现已经编辑我的问题添加代码片段。 – user2714010

+0

所以在我的实现类中只有MuleMessage有效载荷可用 – user2714010

+0

如果你有一个实现类,那么你必须使用'RequestContext.getEvent()。getMessage()'。它已被弃用,但MuleSoft仍未提供您的用例的替代品,因此您没有其他选择。 –

0

如果您有机会获得MuleMessage然后通过使用该方法MuleMessage类可用

Set<String> getPropertyNames(PropertyScope scope); 

获得所需的性能。要获得MuleMessage,您需要访问MuleClient;你有没有进入MuleClient?如果是,则使用:

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

这是你想要达到的目标吗?

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()); 
    } 

} 
+0

感谢Anton为您的输入,这也是使用CXF拦截器获取消息的另一种方式。但是,在Web服务中,我想阅读包含文件元数据并更新数据库的Mule消息属性。因此,我会从Web服务调用dao层,将元数据存储在数据库中。所以我会按照David的建议去做。 – user2714010