0

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/indexURL がヒットすると、クエリ パラメーターの有無にかかわらず、次の例外が発生します。

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 を取り込むと突然文字列を返さなくなる理由がわかりません。この点で何か助けはありますか?

4

1 に答える 1

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) クエリ パラメータをタイプ セーフな方法で処理できるようになります。

于 2011-06-06T19:04:53.530 に答える