【问题标题】:How to set the response at Client side after Data is posted to Web Service using Mule Payload使用 Mule Payload 将数据发布到 Web 服务后如何在客户端设置响应
【发布时间】:2015-07-21 16:54:07
【问题描述】:

我有 2 个 Mule 流程:- ...第一个流程公开了一个执行 DB CRUD 操作的 SOAP Web 服务...我的第一个流程是:-

<flow name="ServiceFlow" doc:name="ServiceFlow">
<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"/>
<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl"/>
</flow>

Web 服务的 SOAP 请求:-

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://services.test.com/schema/MainData/V1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:insertDataRequest>
         <v1:Id>477</v1:Id>
         <v1:Name>ttttt</v1:Name>
         <v1:Age>56</v1:Age>
         <v1:Designation>aaaaaa </v1:Designation>
      </v1:insertDataRequest>
   </soapenv:Body>
</soapenv:Envelope>

SOAP 响应是:-

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <insertDataResponse xmlns="http://services.test.com/schema/MainData/V1">
         <Response>Data inserted Successfully</Response>
         <Id>0</Id>
         <Age>0</Age>
      </insertDataResponse>
   </soap:Body>
</soap:Envelope> 

现在我有另一个流,它是该 Web 服务的客户端流......客户端流是:-

    <flow name="ClientFlow" doc:name="ClientFlow">
            <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8888" path="clientpath" doc:name="HTTP"/>

    <set-payload doc:name="Set Payload" value="#[import com.test.services.schema.maindata.v1.*; dRequest = new DataRequest();dRequest.id = 7;dRequest.age = 55;dRequest.name = 'aValue';dRequest.designation = 'hhhhh'; dRequest]"/>

     <async doc:name="Async">
    <mulexml:object-to-xml-transformer doc:name="Object to XML"/>
    <logger message="payload :- #[message.payload]" level="INFO" doc:name="Logger"/>
    </async>

    <cxf:jaxws-client doc:name="SOAP" serviceClass="com.test.services.schema.maindata.v1.MainData" operation="insertDataOperation" port="MainDataPort" />  

 <http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP" method="POST"/>

</flow>

现在的问题是 .. 在这个客户端流程中,我正在设置来自 Mule &lt;set-payload 的请求......服务工作正常,来自客户端的请求使用 Http 出站发布到主服务......但我是从响应中获取异常..我不知道如何在这里设置响应...我需要在 http outbound 之后再次使用 set Payload 吗?如果是..那我怎么设置它?请帮忙 .. 以下是我得到的例外:-

Exception stack is:
1. unable to marshal type "com.test.services.schema.maindata.v1.DataResponse" as an element because it is missing an @XmlRootElement annotation (com.sun.istack.SAXException2)
  com.sun.xml.bind.v2.runtime.XMLSerializer:244 (null)
2. null (javax.xml.bind.MarshalException)
  com.sun.xml.bind.v2.runtime.MarshallerImpl:328 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/xml/bind/MarshalException.html)
3. failed to mashal objec tto XML (java.io.IOException)
  org.mule.module.xml.transformer.jaxb.JAXBMarshallerTransformer$1:110 (null)
4. failed to mashal objec tto XML (java.io.IOException). Message payload is of type: HttpResponse (org.mule.execution.ResponseDispatchException)
  org.mule.transport.http.HttpMessageProcessTemplate:141 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/execution/ResponseDispatchException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
com.sun.istack.SAXException2: unable to marshal type "com.test.services.schema.maindata.v1.DataResponse" as an element because it is missing an @XmlRootElement annotation
    at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:244)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:303)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)

更新流程:- 我已经使用 Java 组件为客户端流设置响应,它工作正常,没有任何问题...:-

<flow name="ClientFlow" doc:name="ClientFlow">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8888" path="aa" doc:name="HTTP"/>

<set-payload doc:name="Set Payload" value="#[import com.test.services.schema.maindata.v1.*; dRequest = new DataRequest();dRequest.id = 7;dRequest.age = 55;dRequest.name = 'aValue';dRequest.designation = 'hhhhh'; dRequest]"/>

<http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP">
<cxf:jaxws-client doc:name="SOAP" serviceClass="com.test.services.schema.maindata.v1.MainData" operation="insertDataOperation" port="MainDataPort" />
</http:outbound-endpoint>
<custom-transformer class="com.test.request.ResponseTransformer" doc:name="JavaTransformerForResponse"/> <!-- Response Java Class -->
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
<logger message="#[message.payload]" level="INFO" doc:name="JSON Logging"/>
</flow>

现在它工作正常,日志中的响应是:-

Now Entering Method:: com.test.services.schema.maindata.v1.Impl.MainDataImpl.insertDataOperation() *****
Data inserted Successfully
[2014-07-31 13:06:23,150] [INFO ] [[SOAPHeaderInterceptor].connector.http.mule.default.receiver.04] <com.test.services.schema.maindata.v1.DataResponse>
  <response>Data inserted Successfully</response>
  <id>0</id>
  <age>0</age>
</com.test.services.schema.maindata.v1.DataResponse>

但我不想使用 Java 组件进行响应..请建议如何在 Mule 中使用 setpayloadExpression 进行设置...请帮助..

【问题讨论】:

  • 这是一个 JAXB 编组问题,所以我认为它在服务器端,对吧?当您使用 SOAPui 测试服务时,该服务是否正常工作?
  • 是 .. 服务运行良好 David ... 问题仅来自客户端流程 .. 即使我触发客户端流程 . 数据已成功发布到主服务 (ServiceFlow)并且数据被插入到数据库中,但最后抛出异常..我猜是客户端流无法生成响应..请查看 SOAP 响应..有根对象 insertDataResponse ..并且在无法编组根对象的异常...我想我需要以相同的方式为出站端点后的响应设置有效负载..
  • 但我不知道该怎么做......有什么办法可以在客户端显示来自主服务的响应消息??我需要在客户端的出站端点之后设置 DataResponse 对象吗??
  • 您是否尝试过注释掉 async 块以查看这是否会导致问题?当 Mule 构建 ClientFlow 的响应时,还可能出现另一个问题:您希望 Mule 如何序列化响应对象以便可以通过 HTTP 提供服务?
  • 我不明白:custom-transformer 没有对有效负载做任何事情(它得到它并将其设置回来,所以它是一个 noop)但它将响应内容类型设置为“text/html”,尽管响应是 XML。你确定这个custom-transformer 是必要的吗?如果删除它会发生什么?

标签: web-services mule marshalling unmarshalling mule-studio


【解决方案1】:

您可以删除custom-transformer,因为它确实对您没有任何用处。

我相信原来的:

无法将类型“com.test.services.schema.maindata.v1.DataResponse 编组为元素,因为它缺少 @XmlRootElement 注释

问题是由于 Mule 需要一种方法将 DataResponse 对象从 cxf:jaxws-client 编组为可以通过 HTTP 服务回调用者的形式。

mulexml:object-to-xml-transformer 的添加通过提示 Mule 如何编组它解决了这个问题(即不要使用 JAXB,因为它无法工作,而是使用 XStream)。

【讨论】:

  • 是的,David,object-to-xml-transformer 或 object-to-json-transformer 或 object-to-string-transformer ...任何一个都可以在这里用来编组响应对象 ..谢谢大卫..
【解决方案2】:

因此,根据 David 的建议,最终解决方案是使用 object-to-json-transformerobject-to-xml-transformerobject-to-string-transformer 任何一个都可以在此处用于编组响应对象

【讨论】:

    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 2012-11-28
    • 2012-06-24
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多