0

我编写了自己的实现 TemplateExceptionHandler 的类。该类将在响应中设置错误状态,然后在我的 js 中,ajax 调用将输入错误:部分并显示一条消息。

所以在我的 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字符串。例如,如果在我的 freemarker 中我有

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

当我执行

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

在我的回复中,我会发现

<div class="testDiv">my error msg

并且用户将在错误消息中看到这个 div,因为在我的 .js 中我有

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