Dear Sir or Madam,

we having a specific problem in using Wicket 7.10, creating an Ajax-Response 
with multiple <ajax-response> entries.

In our application, we are using onRequestHandlerResolved to do some 
initialization stuff and onRequestHandlerExecuted to save changes done on our 
data during requestHandlerExecutor.execute().
For this purpose, we have created an own AbstractRequestCycleListener which 
overwrites both methods and calls our specific code.

RequestCycle:
private void execute(IRequestHandler handler)
{
try
{
  listeners.onRequestHandlerResolved(this, handler);
  requestHandlerExecutor.execute(handler);
  listeners.onRequestHandlerExecuted(this, handler);
}
catch (RuntimeException e)
{
}
}

Our problem is, that an Exception thrown in onRequestHandlerExecuted after 
requestHandlerExecutor.execute() has already created an ajax-response creates 
an invalid response:

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>

To solve our problem, we tried to clear the existing Response during exception 
in onRequestHandlerExecuted (RequestCycle.get().getResponse().reset()), but we 
are not able to clear the Response, created in 
requestHandlerExecutor.execute(), because wicket uses 
HeaderBufferingWebResponse  by default which did not allow to reset already 
created Response in encapsulated ServletWebResponse. Calling reset in 
HeaderBufferingWebResponse instead throws an IllegalStateException.

We think that the problem came from ServletWebResponse which simply adds 
multiple ajax-response entries to the HttpServletResponse which results in the 
mentioned, invalid 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) {  }
}

My question is, how we could handle our problem when throwing an exception in 
onRequestHandlerExecuted? And how is it possible, that code run after 
requestHandlerExecutor.execute(), redirects correctly to exception page?
How we can run specific code, after the request has been processed, is there 
maybe another way instead of overwriting onRequestHandlerExecuted?

Kind regards

PATRICK SCHWARZER
SOFTWARE ENGINEER

o +49 89 32175 655

TOMTEC Imaging Systems GmbH
Edisonstrasse 6, 85716 Unterschleissheim, Germany, Managing Director:
Johannes Waldinger, Dr. Thomas Piehler, HRB 235646 Amtsgericht Muenchen

[cid:[email protected]]<http://www.tomtec.de/>

_____________________________________________________________

RSNA | 11/25/2018 - 11/30/2018 | Chicago/USA
EuroEcho | 12/05/2018 - 12/08/2018 | Milan/Italy

Reply via email to