您好我想申请的内容似乎很简单,但我不知道如何,需要一些澄清。 这是场景: 我想调用一个web服务方法,这个方法名是find()并接受一个对象作为参数,该对象代表一个组合主键,由两个字符串组成一个id和一个类型。 对象 - 这是soap中的主要键表示形式:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsd="http://wsdouane/">
<soapenv:Header/>
<soapenv:Body>
<wsd:find>
<entity>
<id>string_1</id>
<type>string_2</type>
</entity>
</wsd:find>
</soapenv:Body>
</soapenv:Envelope>
我的第一个想法是从http post请求中读取两个args(id和type),用一个调用主键类构造函数的java转换器创建所需的主键对象,然后将创建的对象传递给soap组件根据对象创建soap请求,然后使用http组件调用Web服务,最后将响应写入文件。 由此产生的流程:
<flow name="testObjetFlow1" doc:name="testObjetFlow1">
<http:inbound-endpoint exchange-pattern="one-way" host="localhost" port="8088" doc:name="HTTP"/>
<custom-transformer class="com.test.transformer.HttpRequestToPrimaryKeyObject" doc:name="PK Object Transformer"/>
<cxf:jaxws-client operation="find" serviceClass="douane.Douane" port="douanePort" doc:name="SOAP"/>
<http:outbound-endpoint exchange-pattern="request-response" method="POST" address="http://localhost:8080/ClientsDB/douane" doc:name="douaneWS"/>
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
<file:outbound-endpoint path="C:\MuleStudio\SandBox\output" outputPattern="#[function:datestamp:dd-MM-yy]_#[function:systime].xml " responseTimeout="10000" doc:name="Outgoing File"/>
</flow>
我的自定义转换器
package com.test.transformer;
import org.mule.api.MuleMessage;
import org.mule.api.transformer.TransformerException;
import org.mule.transformer.AbstractMessageTransformer;
import douane.DouanePK;
public class HttpRequestToPrimaryKeyObject extends AbstractMessageTransformer {
@Override
//DouanePK represent the primary key entity
public DouanePK transformMessage(MuleMessage message, String outputEncoding)
throws TransformerException {
// TODO Auto-generated method stub
String id = message.getInboundProperty("id");
String type = message.getInboundProperty("type");
DouanePK primKey = new DouanePK();
dp.setId(id);
dp.setType(type);
return primKey;
}
}
当我运行项目时,我收到错误
ERROR 2013-05-16 09:44:13,191 [[mediation_mod].testObjetFlow1.stage1.03] org.mule.exception.DefaultMessagingExceptionStrategy:
********************************************************************************
Message : Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject() : Cannot marshal the XStream instance in action
---- Debugging information ----
-------------------------------
message : Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject()
cause-exception : com.thoughtworks.xstream.converters.ConversionException
cause-message : Cannot marshal the XStream instance in action
------------------------------- (com.thoughtworks.xstream.converters.ConversionException). Message payload is of type: byte[]
Code : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Cannot marshal the XStream instance in action
---- Debugging information ----
------------------------------- (com.thoughtworks.xstream.converters.ConversionException)
com.thoughtworks.xstream.converters.reflection.SelfStreamingInstanceChecker:44 (null)
2. Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject() : Cannot marshal the XStream instance in action
---- Debugging information ----
-------------------------------
message : Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject()
cause-exception : com.thoughtworks.xstream.converters.ConversionException
cause-message : Cannot marshal the XStream instance in action
------------------------------- (com.thoughtworks.xstream.converters.ConversionException)
com.thoughtworks.xstream.converters.reflection.SerializationMethodInvoker:140 (null)
3. Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject() : Cannot marshal the XStream instance in action
---- Debugging information ----
-------------------------------
message : Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject()
cause-exception : com.thoughtworks.xstream.converters.ConversionException
cause-message : Cannot marshal the XStream instance in action
------------------------------- (com.thoughtworks.xstream.converters.ConversionException). Message payload is of type: byte[] (org.mule.api.transformer.TransformerMessagingException)
org.mule.transformer.AbstractTransformer:139 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerMessagingException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
com.thoughtworks.xstream.converters.ConversionException: Cannot marshal the XStream instance in action
---- Debugging information ----
-------------------------------
at com.thoughtworks.xstream.converters.reflection.SelfStreamingInstanceChecker.marshal(SelfStreamingInstanceChecker.java:44)
at com.thoughtworks.xstream.core.AbstractReferenceMarshaller.convert(AbstractReferenceMarshaller.java:69)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************
ERROR 2013-05-16 09:44:13,182 [[mediation_mod].testObjetFlow1.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy:
********************************************************************************
Message : Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject() : Cannot marshal the XStream instance in action
---- Debugging information ----
-------------------------------
message : Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject()
cause-exception : com.thoughtworks.xstream.converters.ConversionException
cause-message : Cannot marshal the XStream instance in action
------------------------------- (com.thoughtworks.xstream.converters.ConversionException). Message payload is of type: byte[]
Code : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Cannot marshal the XStream instance in action
---- Debugging information ----
------------------------------- (com.thoughtworks.xstream.converters.ConversionException)
com.thoughtworks.xstream.converters.reflection.SelfStreamingInstanceChecker:44 (null)
2. Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject() : Cannot marshal the XStream instance in action
---- Debugging information ----
-------------------------------
message : Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject()
cause-exception : com.thoughtworks.xstream.converters.ConversionException
cause-message : Cannot marshal the XStream instance in action
------------------------------- (com.thoughtworks.xstream.converters.ConversionException)
com.thoughtworks.xstream.converters.reflection.SerializationMethodInvoker:140 (null)
3. Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject() : Cannot marshal the XStream instance in action
---- Debugging information ----
-------------------------------
message : Could not call org.apache.cxf.binding.soap.SoapMessage.writeObject()
cause-exception : com.thoughtworks.xstream.converters.ConversionException
cause-message : Cannot marshal the XStream instance in action
------------------------------- (com.thoughtworks.xstream.converters.ConversionException). Message payload is of type: byte[] (org.mule.api.transformer.TransformerMessagingException)
org.mule.transformer.AbstractTransformer:139 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerMessagingException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
com.thoughtworks.xstream.converters.ConversionException: Cannot marshal the XStream instance in action
---- Debugging information ----
-------------------------------
at com.thoughtworks.xstream.converters.reflection.SelfStreamingInstanceChecker.marshal(SelfStreamingInstanceChecker.java:44)
at com.thoughtworks.xstream.core.AbstractReferenceMarshaller.convert(AbstractReferenceMarshaller.java:69)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************
我不知道我的逻辑是否错误或是否有一种简单的方法来完成工作? 请你帮忙。
答案 0 :(得分:1)
首先,我不会创建一个custom-transformer
来简单地实例化一个类,我只会使用一个表达式:
<expression-transformer
expression="#[new douane.DouanePK(message.inboundProperties.id,message.inboundProperties.type)]" />
其次,您获得的异常来自mulexml:object-to-xml-transformer
无法使用XStream将SoapMessage
对象转换为XML(这是预期的)。 cxf:jaxws-client
的责任是在流程的响应阶段进行解组。
因此,您需要mulexml:object-to-xml-transformer
上方file:outbound-endpoint
元素中的response
和cxf:jaxws-client
元素,以便在CXF解组对正确对象的响应后对其进行处理
答案 1 :(得分:0)
xml到对象错误是因为SOAP组件,在你的情况下,你可以避免它,只是使用和表达式转换器