OK, I've managed to get rid of all exceptions that were logged.

Here's the working code:

    @Override
    public void onBeginRequest(RequestCycle cycle) {
        Session session = Session.get();
        if (session.getMetaData(REDIRECTED_JSESSIONID) == null) {
logger.debug("first application request - redirecting to loading page");
            session.setMetaData(REDIRECTED_JSESSIONID, Boolean.TRUE);
String url = getServletRequestContextPath() + "/" + cycle.getRequest().getUrl(); cycle.replaceAllRequestHandlers(new RenderPageRequestHandler(new PageProvider(newLoadingPage(url)), RedirectPolicy.ALWAYS_REDIRECT));
            cycle.getResponse().reset();
        }
    }

It sure is MORE code than the previous one-liner (throwing the exception).
If the user should not use a RestartResponseException within a RequestCycleListener in 1.5 any more (since it worked in 1.4) I suggest this to be stated in its JavaDoc.
I'm also not sure in which cases it _IS_ considered to be OK to do so?!

Cheers,
Daniel

- - - - - - - -
Side note:
The resetting of the response was in the right direction but only doing it AFTER setting a new request handler eliminates the following exception:

java.lang.IllegalStateException: Header was already written to response!
at org.apache.wicket.protocol.http.HeaderBufferingWebResponse.checkHeader(HeaderBufferingWebResponse.java:64) at org.apache.wicket.protocol.http.HeaderBufferingWebResponse.setDateHeader(HeaderBufferingWebResponse.java:134) at org.apache.wicket.protocol.http.BufferedWebResponse$SetDateHeaderAction.invoke(BufferedWebResponse.java:310) at org.apache.wicket.protocol.http.BufferedWebResponse.writeTo(BufferedWebResponse.java:580) at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:185) at org.apache.wicket.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:167) at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:750) at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:301) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.executeExceptionRequestHandler(RequestCycle.java:310) at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:224) at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:280) at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:162) at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:218) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1326) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:940) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:874) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
    at org.eclipse.jetty.server.Server.handle(Server.java:349)
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441) at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:904)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:565)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217) at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:50) at org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:245) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
    at java.lang.Thread.run(Unknown Source)

On 14.12.2011 15:45, Daniel Soneira wrote:
The code doing the redirect implements IRequestCycleListener#onBeginRequest - which returns void.

Here's the code snippet:
    @Override
    public void onBeginRequest(RequestCycle cycle) {
        Session session = Session.get();
        if (session.getMetaData(REDIRECTED_JSESSIONID) == null) {
logger.debug("first application request - redirecting to loading page");
            session.setMetaData(REDIRECTED_JSESSIONID, Boolean.TRUE);
String url = getServletRequestContextPath() + "/" + cycle.getRequest().getUrl();
            throw new RestartResponseException(newLoadingPage(url));
        }
    }

I've tried the following which "kind of" works (but still don't get why throwing that Exception is not supported in 1.5) :

    cycle.getResponse().reset(); // not sure if needed?
cycle.replaceAllRequestHandlers(new RenderPageRequestHandler(new PageProvider(newLoadingPage(url))));

Now the redirect is done but the log shows the following stack trace (which doesn't looks right):

ERROR - DefaultExceptionMapper     - Unexpected error occurred
org.eclipse.jetty.io.RuntimeIOException: java.io.IOException: Closed
at org.eclipse.jetty.io.UncheckedPrintWriter.setError(UncheckedPrintWriter.java:110) at org.eclipse.jetty.io.UncheckedPrintWriter.write(UncheckedPrintWriter.java:283) at org.eclipse.jetty.io.UncheckedPrintWriter.write(UncheckedPrintWriter.java:298)
    at java.io.PrintWriter.append(Unknown Source)
at org.apache.wicket.protocol.http.servlet.ServletWebResponse.write(ServletWebResponse.java:106) at org.apache.wicket.protocol.http.HeaderBufferingWebResponse.write(HeaderBufferingWebResponse.java:174) at org.apache.wicket.protocol.http.BufferedWebResponse$WriteCharSequenceAction.invoke(BufferedWebResponse.java:161) at org.apache.wicket.protocol.http.BufferedWebResponse.writeTo(BufferedWebResponse.java:580) at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:247) at org.apache.wicket.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:167) at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:750) at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:252) at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:209) at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:280) at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:162) at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:218) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1326) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:940) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:874) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
    at org.eclipse.jetty.server.Server.handle(Server.java:349)
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441) at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:904)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:565)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217) at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:50) at org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:245) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Closed
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:147)
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:96)
    at java.io.ByteArrayOutputStream.writeTo(Unknown Source)
    at org.eclipse.jetty.server.HttpWriter.write(HttpWriter.java:283)
    at org.eclipse.jetty.server.HttpWriter.write(HttpWriter.java:107)
    at org.eclipse.jetty.server.HttpWriter.write(HttpWriter.java:96)
at org.eclipse.jetty.io.UncheckedPrintWriter.write(UncheckedPrintWriter.java:274)
    ... 36 more

On 14.12.2011 15:28, Martin Grigorov wrote:
Hi,

No need to throw exceptions.
You just need to return IRequestHandler impl that should be used to
handle the error (I assume you talk about
IRequestCycleListener#onException())
Try with: return new RenderPageRequestHandler(new PageProvider(SomePage.class))

On Wed, Dec 14, 2011 at 4:20 PM, Daniel Soneira
<[email protected]>  wrote:
Hi there,

Throwing a RestartResponseException in a custom RequestCycleListener does
not yield the result I was hoping for.
Instead of redirecting to the specified page the DefaultExceptionMapper only
shows an Unexpected RuntimeException page.
The equivalent code (within a custom RequestCycle) used to work in 1.4.

Here's the log:
ERROR - DefaultExceptionMapper     - Unexpected error occurred
org.apache.wicket.RestartResponseException

The listener tries do redirect the very FIRST request - so you have to
restart the jetty server when analyzing the problem.

Attached you'll find a quickstart that demonstrates the problem.
Note: The code is essentially the same as in WICKET-3248.

Any help on this matter is appreciated.
I can also create a JIRA issue if needed.

Kind regards,
Daniel Soneira
--
www.joyn-it.at


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to