我们在使用 Wicket 7.10 时遇到了一个特定问题,即创建一个包含多个条目的 Ajax-Response。
在我们的应用程序中,我们onRequestHandlerResolved
用来做一些初始化工作并onRequestHandlerExecuted
保存在requestHandlerExecutor.execute()
. 为此,我们创建了一个自己的AbstractRequestCycleListener
方法,它覆盖了这两个方法并调用了我们的特定代码。
请求周期:
private void execute(IRequestHandler handler)
{
try
{
listeners.onRequestHandlerResolved(this, handler);
requestHandlerExecutor.execute(handler);
listeners.onRequestHandlerExecuted(this, handler);
}
catch (RuntimeException e)
{
}
}
我们的问题是,在创建 ajax-responseonRequestHandlerExecuted
之后抛出的异常会创建无效响应:requestHandlerExecutor.execute()
Wicket.Ajax: Wicket.Ajax.Call.failure: Error while parsing response: Error: Invalid XML:
<?xml version="1.0" encoding="UTF-8"?>
<ajax-response>
<!-- Result of requestHandlerExecutor.execute() -->
</ajax-response>
<ajax-response>
<!—Redirect to specific Exception Page, result of onRequestHandlerExecuted -->
<redirect>
<![CDATA[./wicket/bookmarkable/our.package.ExceptionPage?locale=en]]>
</redirect>
</ajax-response>
为了解决我们的问题,我们尝试在onRequestHandlerExecuted
( RequestCycle.get().getResponse().reset()
) 中的 Exception 期间清除现有的 Response,但我们无法清除在 中创建的 Response,requestHandlerExecutor.execute()
因为 WicketHeaderBufferingWebResponse
默认使用不允许重置已在封装中创建的 Response ServletWebResponse
。调用 reset inHeaderBufferingWebResponse
会引发IllegalStateException
.
我们认为问题出ServletWebResponse
在简单地将多个 ajax-response 条目添加到HttpServletResponse
导致上述无效 XML 的结果中。
ServletWeb响应:
@Override
public void sendRedirect(String url)
{
try
{
if (webRequest.isAjax())
{
/*
* usually the Ajax-Location header is enough and we do not need to the redirect url
* into the response, but sometimes the response is processed via an iframe (eg
* using multipart ajax handling) and the headers are not available because XHR is
* not used and that is the only way javascript has access to response headers.
*/
httpServletResponse.getWriter().write(
"<ajax-response><redirect><![CDATA[" + url + "]]></redirect></ajax-response>");
}
else { }
}
catch (IOException e) { }
}
抛出异常时我们如何处理问题onRequestHandlerExecuted
?又怎么可能,在 之后运行的代码requestHandlerExecutor.execute()
正确地重定向到异常页面?在处理请求后,我们如何运行特定代码,是否有另一种方法来代替覆盖onRequestHandlerExecuted
?