Перенаправление после того, как Ответ был написан в Wicket 7.10

У нас есть особая проблема в использовании 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 после requestHandlerExecutor.execute() уже создал ajax-ответ создает недопустимый ответ:

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()потому что калитка использует HeaderBufferingWebResponse по умолчанию который не позволял сбросить уже созданный Response в инкапсулированный ServletWebResponse, Вызов сброса в HeaderBufferingWebResponse вместо этого бросает IllegalStateException,

Мы думаем, что проблема возникла из ServletWebResponse который просто добавляет несколько записей AJAX-ответа к HttpServletResponse что приводит к упомянутому, недопустимому 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 ответ

Для каждого Ajax-запроса Wicket выполняет два обработчика запроса:

  • ListenerInterfaceRequestHandler
  • AjaxRequestHandler

Я предполагаю, что ваш #onRequestHandlerExecuted не работает после второго. Это может быть слишком поздно, так как ответ уже сформирован и записан.

Вы можете проверить:

  • почему ваш слушатель терпит неудачу после того, как что-то еще уже произошло?
  • что вы хотите, чтобы ваше приложение делало, когда ваш слушатель терпит неудачу?
  • слушатель не может потерпеть неудачу после первого обработчика уже? зачем ждать больше?
Другие вопросы по тегам