在Wicket 7.10中编写响应后进行重定向

时间:2018-11-16 09:46:25

标签: response wicket wicket-7

在使用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>

为解决我们的问题,我们尝试在onRequestHandlerExecutedRequestCycle.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的另一种方法?

1 个答案:

答案 0 :(得分:0)

对于每个Ajax请求,Wicket执行两个请求处理程序:

  • ListenerInterfaceRequestHandler
  • AjaxRequestHandler

我假设您的#onRequestHandlerExecuted在第二个之后失败。可能已经为时已晚,因为响应已经生成并写入。

您可以检查:

  • 为什么其他任何事情发生后,您的听众为什么 失败?
  • 当监听器失败时,您希望应用程序做什么?
  • 在第一个处理程序完成之后,侦听器是否会失败?为什么还要再等?