У нас есть особая проблема при использовании 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
?