Web services 如何在使用Mule负载将数据发布到Web服务后在客户端设置响应

Web services 如何在使用Mule负载将数据发布到Web服务后在客户端设置响应,web-services,mule,marshalling,unmarshalling,mule-studio,Web Services,Mule,Marshalling,Unmarshalling,Mule Studio,我有一个2骡流量:- …第一个流公开执行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

我有一个2骡流量:- …第一个流公开执行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>
    <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>

更新流:- 我已经使用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>
现在进入Method::com.test.services.schema.maindata.v1.Impl.MainDataImpl.insertDataOperation()*****
数据插入成功
[2014-07-31 13:06:23150][INFO][[SOAPHeaderInterceptor].connector.http.mule.default.receiver.04]
数据插入成功
0
0

但我不想使用Java组件来响应。。请建议如何在Mule中使用setpayload表达式设置它。。。请帮助..

您可以删除
自定义转换器,因为它实际上对您没有任何用处

我相信原文:

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

这个问题是由于Mule需要一种方法将
cxf:jaxws客户机
中的
DataResponse
对象封送到一个可以通过HTTP返回给调用方的表单


通过向xml转换器添加
mulexml:object
提示Mule如何封送它,解决了这个问题(即,不要使用JAXB,因为它无法工作,而是使用XStream)因此,根据David的建议,最终的解决方案是使用
对象到json transformer
对象到xml transformer
对象到字符串transformer
任何一个都可以在这里用来封送响应对象

这是JAXB封送问题,所以我认为它在服务器端,对吗?服务工作正常吗当您使用SOAPui测试它时?是的..服务工作正常David…问题仅来自客户端流..即使在触发客户端流时也是如此。数据已成功发布到主服务(ServiceFlow)数据被插入到数据库中,但异常在最后被抛出..我猜是客户端流无法生成响应..请查看SOAP响应..存在根对象insertDataResponse..在异常中无法封送根对象..我想我需要以相同的方式设置负载对于出站端点之后的响应..但我不知道如何做..是否有任何方法可以在客户端中显示来自主服务的响应消息?是否需要在客户端中的出站端点之后设置DataResponse对象?是否尝试注释掉
async
块以查看这是否会导致问题?另一个问题是当Mule构建
ClientFlow
的响应时,可能会产生e:您希望Mule如何序列化响应对象,以便通过HTTP提供服务?我不明白:
自定义转换器对负载没有任何作用(它获取并设置它,因此它是noop),但它将响应内容类型设置为“text/html”,尽管响应是XML。你真的确定这个
自定义转换器是必要的吗?如果删除它会发生什么?是的,David,object-to-xml transformer或object-to-json transformer或object-to-string transformer。。。这里可以使用任何一个来封送响应对象。。谢谢你,大卫。。
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)
<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>