1

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

4

1 回答 1

0

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

  • 侦听器接口请求处理程序
  • AjaxRequestHandler

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

你可以检查:

  • 为什么你的听众在其他事情发生后失败了?
  • 当您的侦听器失败时,您希望您的应用程序做什么?
  • 在第一个处理程序之后侦听器不能失败吗?为什么还要等?
于 2018-11-16T17:33:17.250 回答