Перенаправление после того, как Ответ был написан в 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 не работает после второго. Это может быть слишком поздно, так как ответ уже сформирован и записан.
Вы можете проверить:
- почему ваш слушатель терпит неудачу после того, как что-то еще уже произошло?
- что вы хотите, чтобы ваше приложение делало, когда ваш слушатель терпит неудачу?
- слушатель не может потерпеть неудачу после первого обработчика уже? зачем ждать больше?