Quantcast
Channel: Apache Timeline
Viewing all articles
Browse latest Browse all 5648

Redirecting to a page from a MethodAdvice implementation

$
0
0
Hello,
I have the following class to handle the execution of methods that are annotated with a custom @ExceptionDisplay annotation. Everything works as expected, but I would like to redirect to a page. I'm using PageRenderLinkSource and Response to do that. I inject them in the same way I usually inject them into pages, but in this case it does not work, because the PageRenderLinkSource and Response instances are both null. I imagine that's because they should be only injected into pages or components, so I'm wondering if / how is it possible to redirect to a page from a MethodAdvice. Thanks in advance for any possible suggestion.

ExceptionDisplayWorker.java

package tapestry.util.annotations;

import java.io.IOException;

import org.apache.tapestry5.Link;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.model.MutableComponentModel;
import org.apache.tapestry5.plastic.MethodAdvice;
import org.apache.tapestry5.plastic.MethodInvocation;
import org.apache.tapestry5.plastic.PlasticClass;
import org.apache.tapestry5.plastic.PlasticMethod;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.apache.tapestry5.services.Response;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
import org.apache.tapestry5.services.transform.TransformationSupport;

import tapestry.pages.ExceptionDisplayPage;
import tapestry.annotations.ExceptionDisplay;

public class ExceptionDisplayWorker implements ComponentClassTransformWorker2

private final MethodAdvice advice = new MethodAdvice()

@Inject
private PageRenderLinkSource pageRenderLinkSource;

@Inject
private Response response;

@Override
public void advise(MethodInvocation invocation)

System.out.println(this.pageRenderLinkSource + ";" + this.response); // Both null.

MethodInvocation result = invocation.proceed();

if (result.didThrowCheckedException())

Exception exception = result.getCheckedException(Exception.class);

exception.printStackTrace();

// Redirect to the exception page :

result.setCheckedException(null);

Link exceptionDisplayPage = this.pageRenderLinkSource.createPageRenderLink(ExceptionDisplayPage.class); // Problem here, pageRenderLinkSource is null.

try

this.response.sendRedirect(exceptionDisplayPage); // Problem here too, response is null too.

catch (IOException e)

e.printStackTrace();

};

@Override
public void transform(PlasticClass plasticClass, TransformationSupport support, MutableComponentModel model)

for (PlasticMethod method : plasticClass.getMethodsWithAnnotation(ExceptionDisplay.class))

method.addAdvice(this.advice);

Viewing all articles
Browse latest Browse all 5648

Trending Articles