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

1 resposta
d34d_d3v1l

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:

@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;
            }
        });
    }
}
E com ele usei mais ou menos assim:
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);
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.

1 Resposta

d34d_d3v1l

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;
			}
		});
	}
}
Criado 12 de fevereiro de 2015
Ultima resposta 13 de fev. de 2015
Respostas 1
Participantes 1