在使用Wicket 7.10时,创建一个包含多个条目的Ajax-Response存在一个特殊的问题。
在我们的应用程序中,我们使用onRequestHandlerResolved
进行一些初始化工作,并使用onRequestHandlerExecuted
保存在requestHandlerExecutor.execute()
期间对数据所做的更改。
为此,我们创建了自己的AbstractRequestCycleListener
,它将覆盖这两种方法并调用我们的特定代码。
RequestCycle:
private void execute(IRequestHandler handler)
{
try
{
listeners.onRequestHandlerResolved(this, handler);
requestHandlerExecutor.execute(handler);
listeners.onRequestHandlerExecuted(this, handler);
}
catch (RuntimeException e)
{
}
}
我们的问题是,在onRequestHandlerExecuted
已经创建了ajax响应之后,在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()
)中清除“异常期间现有的响应”,但由于以下原因,我们无法清除在requestHandlerExecutor.execute()
中创建的响应: Wicket默认使用HeaderBufferingWebResponse
,不允许在封装的ServletWebResponse
中重设已创建的Response。在HeaderBufferingWebResponse
中调用reset会抛出一个IllegalStateException
。
我们认为问题来自ServletWebResponse
,该问题只是向HttpServletResponse
添加了多个ajax响应条目,从而导致了所提到的无效XML。
ServletWebResponse:
@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
的另一种方法?
答案 0 :(得分:0)
对于每个Ajax请求,Wicket执行两个请求处理程序:
我假设您的#onRequestHandlerExecuted在第二个之后失败。可能已经为时已晚,因为响应已经生成并写入。
您可以检查: