在我的<catch-exception-strategy>
中,我将错误有效负载写入file
。但有时当流程涉及Web服务调用且主机不可用或未知(例如,抛出java.net.UnknownHostException
)时,有效负载不再是InputStream
或String
的实例。如果我尝试将错误记录到文件,则抛出以下异常:
exception.AbstractExceptionListener (AbstractExceptionListener.java:299) -
********************************************************************************
Message : Could not find a transformer to transform "SimpleDataType{type=org.apache.commons.httpclient.methods.PostMethod, mimeType='*/*'}" to "SimpleDataType{type=java.io.InputStream, mimeType='*/*'}".
Code : MULE_ERROR-65237
--------------------------------------------------------------------------------
Exception stack is:
1. Could not find a transformer to transform "SimpleDataType{type=org.apache.commons.httpclient.methods.PostMethod, mimeType='*/*'}" to "SimpleDataType{type=java.io.InputStream, mimeType='*/*'}". (org.mule.api.transformer.TransformerException)
org.mule.registry.MuleRegistryHelper:252 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.api.transformer.TransformerException: Could not find a transformer to transform "SimpleDataType{type=org.apache.commons.httpclient.methods.PostMethod, mimeType='*/*'}" to "SimpleDataType{type=java.io.InputStream, mimeType='*/*'}".
at org.mule.registry.MuleRegistryHelper.lookupTransformer(MuleRegistryHelper.java:252)
at org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:355)
at org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:313)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************
我正在考虑在写入文件之前执行choice
块以确保有效负载是可写的。我应该做#[payload instanceof java.io.InputStream]
之类的事吗?但那么有效负载是DOM
还是其他什么情况呢?请指教。
答案 0 :(得分:0)
我会在catch异常策略中使用一个转换器,并在那里封装将考虑输入并产生可写有效负载的逻辑。
答案 1 :(得分:0)
如果要检查是否有可用于特定有效负载类型和输出类型的转换器,我猜您可以从注册表中查找可用的转换器。在Groovy中:
transformers = message.getMuleContext().getRegistry().lookupTransformers(
new org.mule.transformer.types.SimpleDataType(payload.getClass()),
new org.mule.transformer.types.SimpleDataType(java.io.InputStream))
if (transformers.size() == 0) {
//set some variable or whatever
}