Redirect after Response has been written in Wicket 7.10
We having a specific problem in using Wicket 7.10, creating an Ajax-Response with multiple 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) { }
}
How we could handle the problem when throwing an Exception in onRequestHandlerExecuted
? And how is it possible, that code run after requestHandlerExecutor.execute()
, redirects correctly to an Exception page?
How we can run specific code, after the request has been processed, is there maybe another way instead of overwriting onRequestHandlerExecuted
?
response wicket wicket-7
add a comment |
We having a specific problem in using Wicket 7.10, creating an Ajax-Response with multiple 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) { }
}
How we could handle the problem when throwing an Exception in onRequestHandlerExecuted
? And how is it possible, that code run after requestHandlerExecutor.execute()
, redirects correctly to an Exception page?
How we can run specific code, after the request has been processed, is there maybe another way instead of overwriting onRequestHandlerExecuted
?
response wicket wicket-7
I have already answered you on the mailing list two days ago.
– martin-g
Nov 16 '18 at 18:23
Sorry, i did not recognize your answer in the mailing list.
– PSchwarzer
Nov 19 '18 at 8:08
add a comment |
We having a specific problem in using Wicket 7.10, creating an Ajax-Response with multiple 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) { }
}
How we could handle the problem when throwing an Exception in onRequestHandlerExecuted
? And how is it possible, that code run after requestHandlerExecutor.execute()
, redirects correctly to an Exception page?
How we can run specific code, after the request has been processed, is there maybe another way instead of overwriting onRequestHandlerExecuted
?
response wicket wicket-7
We having a specific problem in using Wicket 7.10, creating an Ajax-Response with multiple 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) { }
}
How we could handle the problem when throwing an Exception in onRequestHandlerExecuted
? And how is it possible, that code run after requestHandlerExecutor.execute()
, redirects correctly to an Exception page?
How we can run specific code, after the request has been processed, is there maybe another way instead of overwriting onRequestHandlerExecuted
?
response wicket wicket-7
response wicket wicket-7
edited Nov 16 '18 at 16:32
schauk11erd
470615
470615
asked Nov 16 '18 at 9:46
PSchwarzer
61
61
I have already answered you on the mailing list two days ago.
– martin-g
Nov 16 '18 at 18:23
Sorry, i did not recognize your answer in the mailing list.
– PSchwarzer
Nov 19 '18 at 8:08
add a comment |
I have already answered you on the mailing list two days ago.
– martin-g
Nov 16 '18 at 18:23
Sorry, i did not recognize your answer in the mailing list.
– PSchwarzer
Nov 19 '18 at 8:08
I have already answered you on the mailing list two days ago.
– martin-g
Nov 16 '18 at 18:23
I have already answered you on the mailing list two days ago.
– martin-g
Nov 16 '18 at 18:23
Sorry, i did not recognize your answer in the mailing list.
– PSchwarzer
Nov 19 '18 at 8:08
Sorry, i did not recognize your answer in the mailing list.
– PSchwarzer
Nov 19 '18 at 8:08
add a comment |
1 Answer
1
active
oldest
votes
For each Ajax request Wicket executes two request handlers:
- ListenerInterfaceRequestHandler
- AjaxRequestHandler
I assume your #onRequestHandlerExecuted is failing after the second one. This might be too late since the response is already generated and written.
You could check:
- why does your listener fail after anything else has happened already?
- what do you want your application to do when your listener fails?
- can't the listener fail after the first handler already? why wait any longer?
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53335204%2fredirect-after-response-has-been-written-in-wicket-7-10%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
For each Ajax request Wicket executes two request handlers:
- ListenerInterfaceRequestHandler
- AjaxRequestHandler
I assume your #onRequestHandlerExecuted is failing after the second one. This might be too late since the response is already generated and written.
You could check:
- why does your listener fail after anything else has happened already?
- what do you want your application to do when your listener fails?
- can't the listener fail after the first handler already? why wait any longer?
add a comment |
For each Ajax request Wicket executes two request handlers:
- ListenerInterfaceRequestHandler
- AjaxRequestHandler
I assume your #onRequestHandlerExecuted is failing after the second one. This might be too late since the response is already generated and written.
You could check:
- why does your listener fail after anything else has happened already?
- what do you want your application to do when your listener fails?
- can't the listener fail after the first handler already? why wait any longer?
add a comment |
For each Ajax request Wicket executes two request handlers:
- ListenerInterfaceRequestHandler
- AjaxRequestHandler
I assume your #onRequestHandlerExecuted is failing after the second one. This might be too late since the response is already generated and written.
You could check:
- why does your listener fail after anything else has happened already?
- what do you want your application to do when your listener fails?
- can't the listener fail after the first handler already? why wait any longer?
For each Ajax request Wicket executes two request handlers:
- ListenerInterfaceRequestHandler
- AjaxRequestHandler
I assume your #onRequestHandlerExecuted is failing after the second one. This might be too late since the response is already generated and written.
You could check:
- why does your listener fail after anything else has happened already?
- what do you want your application to do when your listener fails?
- can't the listener fail after the first handler already? why wait any longer?
answered Nov 16 '18 at 17:33
svenmeier
4,7741222
4,7741222
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53335204%2fredirect-after-response-has-been-written-in-wicket-7-10%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
I have already answered you on the mailing list two days ago.
– martin-g
Nov 16 '18 at 18:23
Sorry, i did not recognize your answer in the mailing list.
– PSchwarzer
Nov 19 '18 at 8:08