4

私はajaxリクエスト処理にSpring deferredresult(servlet 3 async)を使用しています.しかし、deferedresultが返された後、ajaxリクエストの成功メソッドでレスポンスオブジェクトを取得していません.これの理由は何ですか?構成に何か不足していますか?

以下は ajax 呼び出しコードです。

function sendajaxreq() {
    $
            .ajax({
                url : "plantView/testLink",
                type : "GET",
                data : "",
                cache : false,
                success : function(messages) {
                    alert(messages);
                },
                error : function(xhr) {
                    if (xhr.statusText != "abort" && xhr.status != 503) {
                        console
                                .error("Unable to retrieve chat messages. Chat ended.");
                    }
                }
            })
}

コントローラーコード:

@RequestMapping(value = "/testLink", method = RequestMethod.GET)
@ResponseBody
public DeferredResult<Map<String, WebView>> testLink() {

    DeferredResult<Map<String, WebView>> chartsResult = new       DeferredResult<Map<String, WebView>>();

    Map<String, WebView> res = processSampleReq();
    chartsResult.setResult(res);
     chartsResult.onCompletion(new Runnable() {
     @Override
     public void run() {
     System.out.println("deffered res completed");
     }
     });

    return chartsResult;
}

chartsResult を返した後でも、ajaxcall 成功メソッドでメッセージを null として取得しています。

web.xml で、deffered result が機能するように私が行った唯一の変更は、ディスパッチャー サーブレットとファイラー マッピングの非同期サポートを追加したことです。

Spring 3.2.0.RELEASE バージョンと Tomcat 7.0.34 を使用しています。

ありがとう、ディプティ。

4

3 に答える 3

1

DeferredResult は、同じスレッドで呼び出さずに Controller によって返されることを意図しています。別のスレッドから呼び出す必要があります。サーブレット 3 非同期サポートの紹介(SpringSource チーム ブログ)を参照してください。しかし、これは空のメッセージとは関係ありません。setResult()setResult()

@ResponseBody で JSONを生成する場合は、Springがクラスパスで Jackson を見つけるようにする必要があります。

内部では、Spring MVC は HttpMessageConverter に委任してシリアライゼーションを実行します。この場合、Spring MVC は、Jackson JSON プロセッサー上に構築された MappingJacksonHttpMessageConverter を呼び出します。クラスパスに Jackson が存在する mvc:annotation-driven 構成要素を使用すると、この実装は自動的に有効になります。

于 2012-12-27T13:17:33.540 に答える
1

問題が発生しました。実際には、応答を後処理して gzip するフィルターがあり、それが問題の原因でした。このフィルターを削除すると、defferedresult が機能しました。

ありがとう、ディプティ。

于 2013-07-05T13:08:06.537 に答える
0

ゲームに少し遅れましたが、私のように誰かがこの問題に遭遇した場合に備えて... 応答本文が消えるという同じ問題があり、それも GZip フィルターが原因でした。これを削除することはできましたが、単純に削除することは私たちにとってランナーではありませんでした. 応答用の GZIPOutputSteam を作成するとき、コンストラクターは syncflush パラメーターを受け取ります。このブール値を true に設定すると、フィルターを保持し、入力された応答本文を取得できます。

于 2015-10-28T10:04:47.617 に答える