【问题标题】:SOAP web service with ActiveMQ produce strange response带有 ActiveMQ 的 SOAP Web 服务产生奇怪的响应
【发布时间】:2015-07-23 02:49:38
【问题描述】:

我有一个 Mule Flow,它公开了一个 SOAP Web 服务:-

<jms:activemq-connector name="Active_MQ" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"/>

<flow name="Flow1" doc:name="Flow1" >
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP"/>
<cxf:jaxws-service serviceClass="com.test.services.schema.maindata.v1.MainData"  doc:name="SOAP"/>
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
<jms:outbound-endpoint queue="NewQueue" connector-ref="Active_MQ" doc:name="JMS" exchange-pattern="request-response"/>
<logger message="Response2 :- #[message.payload]" level="INFO" doc:name="Logger"/>
<mulexml:xml-to-object-transformer doc:name="XML to Object"/>
</flow>


<flow name="flow2" doc:name="flow2" >
<jms:inbound-endpoint connector-ref="Active_MQ" address="jms://tcp:NewQueue" doc:name="JMS" exchange-pattern="request-response" disableTemporaryReplyToDestinations="true" responseTimeout="90000"/>
<set-variable variableName="SOAPRequest" value="#[message.payload]" doc:name="Variable"/>
<mulexml:xml-to-object-transformer doc:name="XML to Object"/>
<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl">
<method-entry-point-resolver>
        <include-entry-point method="retrieveDataOperation"/>
        <include-entry-point method="insertDataOperation"/>
        <include-entry-point method="updateDataOperation"/>
        <include-entry-point method="deleteDataOperation"/>
</method-entry-point-resolver>
</component>
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
 </flow>

现在Web服务中有4个方法:- MainDataImpl类中的retrieveDataOperation()、insertDataOperation()、updateDataOperation()和deleteDataOperation()。所有方法都有不同的响应消息……但奇怪的是如果我在 SOAP UI 中测试应用程序,我会发现 insertDataOperation() 和 updateDataOperation() 操作都会给出相同的响应,尽管 MainDataImpl 类中的响应不同.. 我不知道为什么 updateDataOperation() 方法会显示 insertDataOperation() 的响应..

我怀疑在当前流程中我使用了以下内容:-

<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl">
<method-entry-point-resolver>
        <include-entry-point method="retrieveDataOperation"/>
        <include-entry-point method="insertDataOperation"/>
        <include-entry-point method="updateDataOperation"/>
        <include-entry-point method="deleteDataOperation"/>
</method-entry-point-resolver>
</component>

我的xsd文件如下:-

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://services.test.com/schema/MainData/V1" xmlns:tns="http://services.test.com/schema/MainData/V1" elementFormDefault="qualified">


    <complexType name="dataRequest">
        <sequence>
            <element name="Id" type="int"></element>
            <element name="Name" type="string"></element>
            <element name="Age" type="int"></element>
            <element name="Designation" type="string"></element>
        </sequence>
    </complexType>

    <complexType name="dataResponse">
        <sequence>
            <element name="Response" type="string"></element>
            <element name="Id" type="int"></element>
            <element name="Name" type="string"></element>
            <element name="Age" type="int"></element>
            <element name="Designation" type="string"></element>
        </sequence>
    </complexType>

    <element name="insertDataRequest" type="tns:dataRequest"></element>

    <element name="insertDataResponse" type="tns:dataResponse"></element>


    <element name="retrieveDataRequest" type="tns:retrieveRequest"></element>

    <element name="retrieveDataResponse" type="tns:dataResponse"></element>

    <complexType name="retrieveRequest">
        <sequence>
            <element name="Id" type="int"></element>
        </sequence>
    </complexType>

    <element name="updateDataRequest" type="tns:dataRequest"></element>

    <element name="updateDataRespone" type="tns:dataResponse"></element>

    <complexType name="deleteRequest">
        <sequence>
            <element name="ID" type="int"></element>
        </sequence>
    </complexType>

    <element name="deleteDataRequest" type="tns:deleteRequest"></element>

    <element name="deleteDataResponse" type="tns:dataResponse"></element>
</schema>

我是否需要在 JMS 出站端点之前添加一些内容,以便区分这两种方法..请帮助..

【问题讨论】:

    标签: mule mule-studio


    【解决方案1】:

    我认为method-entry-point-resolver 一点用都没有:Mule 可以自动定位这 4 种方法。

    主要问题在于insertDataOperationupdateDataOperation 都接收到相同类型的对象(DataRequest);而retrieveDataRequest 接收RetrieveRequestdeleteDataOperation 接收DeleteRequest

    您能否更改 WSDL,以便 insertDataOperationupdateDataOperation 接收特定类型?

    如果没有,那么您将不得不根据 CXF 创建的流变量(methodcxf_operationcxf_service)。

    您可能还想使用invoke 消息处理器而不是component 来更轻松地控制调用的方法。

    【讨论】:

    • 嗨大卫..一个疑问..我怎样才能进入 cxf_operation ..我打算将要调用的方法存储在一个变量中,然后在
    • 有什么方法可以从 CXF 中获取 Flow 1 中的方法名称并将其存储,以便我可以在 flow2 中使用此变量并在 Java 组件中使用它来调用它??
    【解决方案2】:

    所以,按照大卫的建议,可行的解决方案是在属性中设置方法名

     <set-property propertyName="methodName" value="#[cxf_operation.localPart]" doc:name="methodNameProperty"/>
    

    然后在Java实现类中调用它:-

    <component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="Java">
        <property-entry-point-resolver property="methodName"/> 
     </component>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多