[Resolvido] VRaptor 4 - Pegar URL completa via código

Olá,

Em um projeto com VRaptor 3, eu precisei pegar dinamicamente a URI de um recurso anotado com VRaptor. Isto para que eu pudesse montar um email com uma URL de confirmação de email. Aqui no forum me ajudaram e eu criei um componente que chamei de Linker:

[code]@Component
public class Linker {

private Proxifier proxifier;
private Router router;
private HttpServletRequest request;

private Class<?> clazz;
private Method invokedMethod;
private Object[] arguments;

public Linker(Proxifier proxifier, Router router, HttpServletRequest request) {
    this.proxifier = proxifier;
    this.router = router;
    this.request = request;
}

public String getURL() {
    return "http://" + request.getHeader("Host") + request.getContextPath()
            + getURI();
}

private String getURI() {
    return router.urlFor(clazz, invokedMethod, arguments);
}

public <T> T buildLinkTo(Class<T> clazz) {
    this.clazz = clazz;
    return proxifier.proxify(clazz, new MethodInvocation<T>() {
        @Override
        public Object intercept(T proxy, Method method, Object[] args,
                SuperMethod superMethod) {
            invokedMethod = method;
            arguments = args;

            return null;
        }
    });
}

}[/code]
E com ele usei mais ou menos assim:

[code]
linker.buildLinkTo(EmailConfirmationController.class).confirm(null);
String url = linker.getURL();

url = url.substring(0, url.length() - 1);

String confirmationLink = url + "/" + user.getEmail();

linker.buildLinkTo(RootController.class).index();
String homeUrl = linker.getURL();

String body = labeler.translate("email.confirmation.html.msg", homeUrl, confirmationLink);[/code]

Desta maneira consegui montar o email com os links de forma dinamica.

Hoje, usando VRaptor 4, estou com o mesmo problema. Existe uma maneira mais facil de resolver este problema ? Se não, podem me ajudar a escrever um “Linker” adaptado para o VRaptor 4?

Muito obrigado.

O código é bem parecido. Deveria ter olhado o código do VRaptor 4 antes de fazer esta pergunta.

Mas, espero que seja útil para alguém:

import java.lang.reflect.Method;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.http.route.Router;
import br.com.caelum.vraptor.proxy.MethodInvocation;
import br.com.caelum.vraptor.proxy.Proxifier;
import br.com.caelum.vraptor.proxy.SuperMethod;

@RequestScoped
public class Linker {

	@Inject
	private Proxifier proxifier;

	@Inject
	private Router router;

	@Inject
	private HttpServletRequest request;

	private Class<?> clazz;
	private Method invokedMethod;
	private Object[] arguments;

	public String getURL() {
		return "http://" + request.getHeader("Host") + request.getContextPath() + getURI();
	}

	private String getURI() {
		return router.urlFor(clazz, invokedMethod, arguments);
	}

	public <T> T buildLinkTo(Class<T> clazz) {
		this.clazz = clazz;
		return proxifier.proxify(clazz, new MethodInvocation<T>() {
			@Override
			public Object intercept(T proxy, Method method, Object[] args, SuperMethod superMethod) {
				invokedMethod = method;
				arguments = args;

				return null;
			}
		});
	}
}