2011-06-03 88 views
0

我試圖創建一個簡單的服務,其中的HTTP請求時,我得到地圖查詢參數的鍵/值對例外,我回復了一些迴應。這裏是我的配置文件的相關部分:騾3.1 - 消息變換爲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請求到-param-map變換器,我可以接受一個字符串並返回一個字符串。我不明白爲什麼在Map中突然停止返回String。在這方面有什麼幫助?

回答

1

我不知道如何解決這個問題,因爲我問它,但我發現了一個更好的解決方法。通過使用內置的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)它適當地設置標題內容類型,因此瀏覽器等知道如何顯示輸出(作爲XML而不是原始文本)。 2)它允許我有一個類型安全的方式來處理查詢參數。