java - Mule 3.1 - 使用 http-request-to-parameter-map 转换器的消息转换异常

标签 java http esb mule

我正在尝试创建一个简单的服务,在该服务中发出 HTTP 请求,获取查询参数的键/值对映射,并返回一些响应内容。这是我的配置文件的相关部分:

<servlet:http-request-to-parameter-map name="http-request-to-param-map"/>

<pattern:simple-service name="ScenarioIndex"
            address="http://localhost:63081/index"

            transformer-refs="http-request-to-param-map"            
            >
            <component>
                <singleton-object class="com.test.ScenarioIndex"/>
            </component>
</pattern:simple-service>

这是 ScenarioIndex 类的相关部分。

public Object scenarioIndex(Map queryParameters) {
return queryParameters.toString();
}

首先,我只想测试查询参数片段是否按我想象的方式工作,因此我返回查询参数的字符串表示形式。此后的实际实现将更加复杂。

服务器启动正常,但是当访问 localhost:63081/index URL 时,无论有或没有查询参数,我都会收到以下异常:

ERROR 2011-06-03 13:29:04,353 [connector.http.mule.default.receiver.2] org.mule.exception.DefaultServiceExceptionStrategy: 
********************************************************************************
Message               : The object transformed is of type: "SimpleDataType{type=org.mule.transport.NullPayload, mimeType='*/*'}", but the expected return type is "SimpleDataType{type=java.util.Map, mimeType='*/*'}". Message payload is of type: String
Type                  : org.mule.api.transformer.TransformerMessagingException
Code                  : MULE_ERROR--2
Payload               : /index?param=true
JavaDoc               : http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerMessagingException.html
********************************************************************************
Exception stack is:
1. The object transformed is of type: "SimpleDataType{type=org.mule.transport.NullPayload, mimeType='*/*'}", but the expected return type is "SimpleDataType{type=java.util.Map, mimeType='*/*'}". Message payload is of type: String (org.mule.api.transformer.TransformerMessagingException)
  org.mule.transformer.AbstractMessageTransformer:183 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerMessagingException.html)
********************************************************************************
Root Exception stack trace:
org.mule.api.transformer.TransformerMessagingException: The object transformed is of type: "SimpleDataType{type=org.mule.transport.NullPayload, mimeType='*/*'}", but the expected return type is "SimpleDataType{type=java.util.Map, mimeType='*/*'}". Message payload is of type: String
    at org.mule.transformer.AbstractMessageTransformer.checkReturnClass(AbstractMessageTransformer.java:183)
    at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:162)
    at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:93)
    at org.mule.DefaultMuleMessage.applyAllTransformers(DefaultMuleMessage.java:1305)
    at org.mule.DefaultMuleMessage.applyTransformers(DefaultMuleMessage.java:1265)
    at org.mule.DefaultMuleMessage.applyTransformers(DefaultMuleMessage.java:1258)
    at org.mule.transformer.AbstractTransformer.process(AbstractTransformer.java:118)
    at org.mule.processor.ExceptionHandlingMessageProcessor.process(ExceptionHandlingMessageProcessor.java:25)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:185)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:158)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:145)
    at org.mule.transport.http.HttpMessageReceiver$HttpWorker.doRequest(HttpMessageReceiver.java:247)
    at org.mule.transport.http.HttpMessageReceiver$HttpWorker.processRequest(HttpMessageReceiver.java:206)
    at org.mule.transport.http.HttpMessageReceiver$HttpWorker.run(HttpMessageReceiver.java:164)
    at org.mule.work.WorkerContext.run(WorkerContext.java:309)
    at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
    at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
    at java.lang.Thread.run(Thread.java:680)

如果我取出对 http-request-to-param-map 转换器的引用,我可以接受一个字符串并返回一个字符串。我不明白为什么接受 Map 会突然阻止我返回 String。在这方面有什么帮助吗?

最佳答案

我不知道如何解决这个问题,但我找到了更好的解决方法。通过使用内置的 Jersey RESTful 支持,我可以以更好的方式获取查询参数。我的服务变成了

<pattern:simple-service name="ScenarioIndex"
   address="http://localhost:63081/index"
   type="jax-rs">

   <component>
        <singleton-object class="com.test.ScenarioIndex"/>
    </component>
</pattern:simple-service>

在我的类里面:

    @GET
@Produces(MediaType.APPLICATION_XML)
@Path("/kml")
public String scenarioIndex(
        @QueryParam("startTime") @DefaultValue("-1") long startTime,
        @QueryParam("endTime") @DefaultValue("-1") long endTime) {
          // do the work in here
          return null;
    }

这对我来说有一些好处。 1) 它适本地设置 header 内容类型,以便浏览器等知道如何显示输出(作为 XML,而不是原始文本)。 2) 它允许我以类型安全的方式处理查询参数。

关于java - Mule 3.1 - 使用 http-request-to-parameter-map 转换器的消息转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6230671/

相关文章:

java - 整数字段的 Bean 验证

java - 无法理解递归阶乘

forms - Nodejs POST 请求多部分/表单数据

java - 骡子 ESB : Expression Filter with regex() function

java - 将位图数组设置为 imageview 时发生主线程网络异常

ruby-on-rails - HTTParty 错误 400 : Invalid header name on simple GET request

http - HTTP ResponseWriter 的 write 函数会在 Go 中缓冲吗?

java - Mule 3.3 表达式 - 忽略流变量比较的大小写

jboss - 将Drools与JBossESB集成

java - 使用 Java Process Builder 启动 GitLog