Перенаправление после того, как Ответ был написан в Wicket 7.10 - PullRequest
0 голосов
/ 16 ноября 2018

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

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

0 голосов
/ 16 ноября 2018

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

  • ListenerInterfaceRequestHandler
  • AjaxRequestHandler

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

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

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