No VRaptor interceptar um método que não é chamado através de uma requisição a uma URL

11 respostas
almircampos

Caros,

Com o VRaptor é possível interceptar um método que NÃO esteja anotado com @Path, usando uma annotation customizada?

Por exemplo, consigo interceptar o método abaixo e verificar se ele tem a MinhaAnotacao:

@Path( "/" )
@MinhaAnotacao
public void index() {}

Isso é possível porque o meu interceptor está anotado com @RequestScoped e o método acima está sendo acessado através de uma requisição à URL “/”.

Mas eu não consigo interceptar o método abaixo, pois ele não contém um @Path. Trata-se de um metodo interno que eu também preciso interceptar:

@MinhaAnotacao
public void metodoImportante(){}

Então, retornando à pergunta, gostaria de saber se com o VRaptor consigo interceptar o metodoImportante, mesmo ele sendo acessado através de uma chamada direta (e não através de uma URL) como, por exemplo:

<codigo>
<codigo>
metodoImportante();
<codigo>
<codigo>

Em caso negativo, o que devo fazer para interceptá-lo com uma anotação, num ambiente onde estou usando o VRaptor?

Grato,
Almir.

11 Respostas

Lucas_Cavalcanti

Pra interceptar um método qualquer vc precisa usar AOP, não vai dar pra usar os interceptors do vraptor, que só valem pra requisições…

pra isso, vc precisa usar o módulo AOP do DI container que vc escolheu (spring ou guice)…

qual vc está usando?

almircampos

Oi, Lucas.

Na verdade, dei uma fuçada em outros sites e vi muitos exemplos utilizando várias tecnologias. Aí fiquei na dúvida do que usar mantendo a compatibilidade com o VRaptor e, claro, também me perguntei se o VRaptor já poderia fazer isso.

Você tem uma indicação de um tutorial ou exemplo completo que eu possa usar para ver como funciona?

Grato,
Almir.

Lucas_Cavalcanti

usar o recurso de AOP do spring ou do guice é 100% compatível com o VRaptor… no máximo vai te obrigar a usar interfaces em todas as dependências…

vc não me respondeu, tá usando spring ou guice? aí eu te dou uma ajuda mais específica :wink:

almircampos

Oi, Lucas. Realmente acabei sem responder direito. Estou usando o Spring.

Sds,
Almir.

Lucas_Cavalcanti

http://static.springsource.org/spring/docs/3.0.7.RELEASE/reference/html/aop.html

pra usar com o vraptor, crie um applicationContext.xml no classpath (src ou src/main/resources)

basicamente vc vai precisar declarar o namespace do aop no xml do spring, colocar o aop:aspectj-autoproxy/ e declarar o bean

também precisa das libs aspectjweaver.jar e aspectjrt.jar

e daí é só criar a classe:

@Aspect
public class MinhaAnnotationInterceptor {

   @Around("@annotation(pacote.completo.MinhaAnotacao)")
   public Object metodo(ProceedingJoinPoint jp) {
        //faz algo antes
       Object retorno = jp.proceed();
       //faz algo depois
       return retorno;
   
   }
}

se quiser fazer algo só antes, pode usar o @Before, e se for só depois o @After

almircampos

Lucas, obrigado pela resposta.

Na verdade, pensei que já existiria uma forma mais simples de fazer isso (no VRaptor é bastante simples criar um interceptor usando uma anotação, paro o caso de um request).

Uma das dificuldades que encontrei nas “fuçadas” foi que todos indicam como funcionam as partes, mas não consegui identificar um projeto simples que eu pudesse baixar e ver as parte integradas funcionando.

Então, vamos à luta e estudar o material que você indicou.

Sds,
Almir.

Lucas_Cavalcanti

tb é só usar uma anotação (@Aspect)… só precisa da pré-configuração de aspectos do spring tb :stuck_out_tongue:

almircampos

Obrigado, Lucas.

Mesmo assim vou ter que estudar um pouco para implementar esses dois “só”, que vc falou… :roll:

Lucas_Cavalcanti

se vc preferir mudar pro guice, aqui parece mais fácil:

daí ao invés de escrever xml, vc cria uma classe java pro module do guice e faz o bindInterceptor pra sua anotação.

almircampos

Ao fazer essa mudança eu posso simplesmente remover os jar do Spring e incluir os do Guice? Ou teria que fazer outras adaptações no código?

Grato,
Almir.

Lucas_Cavalcanti

sim, só trocar os jars…

Criado 23 de maio de 2012
Ultima resposta 23 de mai. de 2012
Respostas 11
Participantes 2