0

TemplateExceptionHandler を実装する独自のクラスを作成しました。そのクラスは応答でエラーステータスを設定し、js で ajax 呼び出しが error: 部分に入り、メッセージを表示します。

したがって、私の TemplateExceptionHandler には次のものがあります。

    String message = "my error msg";

    HttpServletResponse response = ServletActionContext.getResponse();
    // set the message in response
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

    PrintWriter out = null;
    try {
        response.setCharacterEncoding("UTF-8");
        out = response.getWriter();
        out.print(message);
    } catch (IOException ioe) {
        LOGGER.error("IOException in printMessage : " + ioe.getMessage(), ioe);
    } finally {
        if (out != null) {
            out.flush();
            out.close();
        }
    }

私がそうするときを除いて、すべてがうまくいっています

    response.getWriter();

例外が発生した freemarker の部分によっては、既に html 文字列が存在します。たとえば、私のフリーマーカーで私が持っていた場合

   <div class="testDiv">${unexistingVariable}</div>

私が実行するとき

   out = response.getWriter();
   out.print(message);

私の応答で私は見つけます

<div class="testDiv">my error msg

そして、ユーザーは、エラー メッセージにこの div が表示されます。

    error : function(jqXHR, textStatus, errorThrown) {
            ...
            contentDialog.html(jqXHR.responseText);

私の response.getWriter() が、例外が発生するまで処理されたコードで既に満たされている理由と、エラー メッセージのみを含むクリーンな応答オブジェクトをインスタンス化する方法を教えてください。

ありがとうございました

4

1 に答える 1

1

半完成ページがクライアントに送り返されないようにする場合は、フルページ バッファリングを使用する必要があります。これは、FreeMarker のエラー処理や、FreeMarker からも独立していWriterます (渡されたものに盲目的に書き込むだけですTemplate.process)。

また、これにはFreeMarkerテンプレート例外ハンドラが必要ですか? Template.processテンプレートでエラーが発生すると例外がスローされるため、FreeMarker の外部で発生する他の例外と同じように処理できます。-sの主な目的はTemplateExceptionHandler、出力にエラー情報を含めること (デバッグなど)、または特定のエラーを抑制することです。したがって、これらのようなものが必要ない場合は、FreeMarker の外部で例外をキャッチするだけです (そして、TemplateExceptionHandler.RETHROW_HANDLERわかりやすくするために使用することができます)。

于 2013-06-18T16:12:25.357 に答える