我编写了自己的类来实现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()已经填充了在异常发生之前处理的代码,以及如何实例化一个只有我的错误消息的干净响应对象?
谢谢
答案 0 :(得分:1)
如果要防止将半成品页面发送回客户端,则必须使用整页缓冲。这与FreeMarker错误处理无关,甚至与FreeMarker无关(它只是盲目地写入您传递给Writer
的任何Template.process
。
此外,您确定需要 FreeMarker 模板异常处理程序吗? Template.process
在模板中发生错误时抛出异常,因此您可以像在FreeMarker外部发生的任何其他异常一样处理。 TemplateExceptionHandler
- s的主要目的是在输出中包含错误信息(如用于调试),或者抑制某些错误。因此,如果你不想要这样的东西,只需在FreeMarker之外捕获异常(为了清楚起见,你可以使用TemplateExceptionHandler.RETHROW_HANDLER
。)