简体   繁体   中英

Mule 3.1 - Message transform exception with http-request-to-parameter-map transformer

I am attempting to create a simple service in which an HTTP request is made, I get a map of key/value pairs for the query parameters, and I return something in response. Here is the relevant portion of my config file:

<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>

Here is relevant portion of the ScenarioIndex class.

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

To start off with I just want to test that the query parameter piece is working the way I think it is, so I'm returning a string representation of the query parameters. The real implementation after this is working will be more sophisticated.

The server launches fine, but when that the localhost:63081/index URL is hit, with or without query parameters, I get the following exception:

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)

If I take out the reference to the http-request-to-param-map transformer, I can take in a String and return a String. I don't understand why taking in a Map suddenly stops me from returning a String. Any help in this regard?

I have no idea how to solve this problem as I asked it, but I found a much better workaround. By using the Jersey RESTful support built in, I can get the query parameters in a much better way. My service became

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

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

and in my class:

    @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;
    }

This does a few things for me. 1) It sets header content types appropriately so browser etc knows how to display the output (as XML as opposed to raw text). 2) It allows me to have a type safe way of handling query parameters.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM