Freemarker中的错误处理

时间:2013-06-18 10:15:29

标签: java jquery struts2 jboss freemarker

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

所以在我的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()已经填充了在异常发生之前处理的代码,以及如何实例化一个只有我的错误消息的干净响应对象?

谢谢

1 个答案:

答案 0 :(得分:1)

如果要防止将半成品页面发送回客户端,则必须使用整页缓冲。这与FreeMarker错误处理无关,甚至与FreeMarker无关(它只是盲目地写入您传递给Writer的任何Template.process

此外,您确定需要 FreeMarker 模板异常处理程序吗? Template.process在模板中发生错误时抛出异常,因此您可以像在FreeMarker外部发生的任何其他异常一样处理。 TemplateExceptionHandler - s的主要目的是在输出中包含错误信息(如用于调试),或者抑制某些错误。因此,如果你不想要这样的东西,只需在FreeMarker之外捕获异常(为了清楚起见,你可以使用TemplateExceptionHandler.RETHROW_HANDLER。)