Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Freemarker中的错误处理_Java_Jquery_Struts2_Jboss_Freemarker - Fatal编程技术网

Java Freemarker中的错误处理

Java Freemarker中的错误处理,java,jquery,struts2,jboss,freemarker,Java,Jquery,Struts2,Jboss,Freemarker,我编写了自己的类来实现TemplateExceptionHandler。该类将在响应中设置错误状态,然后在myjs中,ajax调用将进入error:part并显示一条消息 因此,在我的TemplateExceptionHandler中,我有: String message = "my error msg"; HttpServletResponse response = ServletActionContext.getResponse(); // set the mess

我编写了自己的类来实现TemplateExceptionHandler。该类将在响应中设置错误状态,然后在myjs中,ajax调用将进入error: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>
在我的回答中,我会发现

<div class="testDiv">my error msg
您能告诉我为什么我的response.getWriter()中已经填充了在异常发生之前处理过的代码,以及如何实例化一个只包含错误消息的干净响应对象吗


谢谢

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


另外,您确定需要一个FreeMarker模板异常处理程序吗<代码>模板。当模板中发生错误时,process会抛出异常,所以您可以像处理FreeMarker之外发生的任何其他异常一样处理该异常。
TemplateExceptionHandler
-s的主要目的是在输出中包含错误信息(如用于调试),或抑制某些错误。因此,如果您不想要类似的内容,只需捕获FreeMarker之外的异常(然后为了清晰起见,您可以使用
TemplateExceptionHandler.RETHROW\u HANDLER

handleTemplateException
方法中有
Writer out
参数。为什么不使用它呢?因为我必须传递response.setStatus(HttpServletResponse.SC\u BAD\u请求);为了进入泛型错误:my js的一部分,它正在为客户端构建泛型错误对话框。它已经填充了已处理的代码,因为已经有已处理的代码。您可以尝试
response.reset()
,但这是否有效取决于是否发送了任何数据。初始化后重置有帮助。谢谢我希望避免捕获操作try{}catch(Exception)中的所有异常,因为有些开发人员忘记捕获所有现有操作中的异常。这就是为什么我想添加一个每次都会执行的全局案例。在大多数应用程序中,你不应该在(大多数)操作中捕捉异常。通常您只是让它们冒泡,直到框架记录它们,回滚事务,重置响应,生成HTTP500。情况与模板例外情况相同;它只是一个例外,与其他任何异常一样,所以您可能不应该在
template.process
中发现它。另外,一个操作不应该直接调用
template.process
,因为这是MVC框架的职责,所以只能在一个地方执行。我同意你的观点,struts的默认异常处理是一个丑陋的弹出窗口,向用户显示异常堆栈。我需要一些非常具体的东西,所有的动作都是通过ajax调用的,所有带有错误状态的响应都由通用的error:ajax函数处理。因此,对于框架中的每个异常,我都需要在响应中设置错误状态和特定消息。我创建了我的特定ExceptionMappingInterceptor,现在所有的异常都通过这个类传递。java异常处理得很好(我在jQueryAjax错误:part中输入),但freemarker异常不会通过此错误传递:ajax函数的一部分(我不明白它们为什么不同)也许找出这些问题的最快方法是调试Struts,看看它如何处理视图部分。。。如果Struts在生产模式下向用户显示堆栈跟踪,那么它就被破坏了。(如果你指的是黄红色的东西,那就是FreeMarker的HTML_调试错误处理程序,但任何人都不应该在生产模式中使用它。顾名思义,它是用于调试的。但它在打印跟踪后仍会重新抛出异常。)
<div class="testDiv">my error msg
    error : function(jqXHR, textStatus, errorThrown) {
            ...
            contentDialog.html(jqXHR.responseText);