VRaptor3 + @Aspect: pointcut em um controller

13 respostas
Yokomizo

Estou aprendendo java, e consegui fazer algumas coisas com aspect no vraptor, mas estou com um problema.

ao tentar colocar um pointcut em um metodo do controller anotado por @Resource, o método é invocado por reflexão (pelo menos eu acho que é isso), e por esse motivo não consigo colocar um point cut em um controller específico.

exemplo:

@Pointcut("execution(public * save(..))")

Esse funciona pois não estou definindo a classe, mas somente o método.

outro exemplo:

@Pointcut("execution(public br.teste.controller.DefaultController cadastro(..))")

Esse não funciona pois definindo a classe br.teste.controller.DefaultController, mas o método parece estar sendo invocado de um reflection.

Não tenho certeza disso do reflection mas deixo aqui minha dúvida. Como coloco pointcuts nos métodos dos controllers?

13 Respostas

Lucas_Cavalcanti

não funciona pois dá um erro, ou não funciona pois não acontece nada?

Lucas_Cavalcanti

de qqer forma, pra métodos de controllers, vc pode criar um Interceptor ao invés de um Aspect (na prática é a mesma coisa, o stack.next() executa o método de verdade)

Yokomizo

não acontece nada…

se e executo:

@Pointcut("execution(public * index(..))")
	public void testepc(){};

	@Before("testepc()")
	public void testeBefore(JoinPoint joinPoint){
		System.out.println(joinPoint.getTarget().getClass());
		System.out.println("BEFOOOOOOOORE");
	}

ele printa:

class br.teste.controller.DefaultController
BEFOOOOOOOORE

mas,

se eu executo:

@Pointcut("execution(public br.teste.controller.DefaultController index(..))")
	public void testepc(){};

	@Before("testepc()")
	public void testeBefore(JoinPoint joinPoint){
		System.out.println(joinPoint.getTarget().getClass());
		System.out.println("BEFOOOOOOOORE");
	}

não acontece nada… mas também não da erro.

Esqueci algo?

Yokomizo

Eu tentei usar interceptor mas preciso tratar os parametros antes do metodo ser executado.

Então eu sempre chamava o ParametersInstantiatorInterceptor antes para instanciar os metodos, e utiliza-los, mas o vraptor acabava chamando esse interceptor dinovo…

se tiver alguma forma do meu interceptor executar entre ParametersInstantiatorInterceptor e o método seria o ideal…

Lucas_Cavalcanti

pq public …DefaultController index() é um método chamado index que retorna um DefaultController

Lucas_Cavalcanti

crie uma classe igual a essa (possivelmente com outro nome):

http://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/core/DefaultRequestExecution.java

anote-a com @Component, e coloque a linha

interceptorStack.add(InterceptorListPriorToExecutionExtractor.class);

depois da linha

interceptorStack.add(ParametersInstantiatorInterceptor.class);
Yokomizo

vou fazer isso então… ai se algum dia eu precisar interceptar algo antes do ExecuteMethodInterceptor.class eu coloco ai nessa lista né?


então resolvido!
Valeu Lucas!

mas eu estava fazendo errado o @Pointcut será? Queria saber fazer dessa outra forma também…

Yokomizo

Lucas, achei o erro… desulpa ai mas foi erro na minha sintaxe!

//Eu estava fazendo assim... errado... DefaultController index
@Pointcut("execution(* br.teste.controller.DefaultController index(..))")

//Não coloquei o ponto entre o DefaultController e o index
//Assim funcionou
@Pointcut("execution(* br.teste.controller.DefaultController.index(..))")
Yokomizo

Bom… valeu por me ensinar o funcionamento dessa parte do vraptor :smiley: dos interceptors… e desculpa ai que eu estou começando com java…

Lucas_Cavalcanti

se eu não me engano a regra do pointcut é:

execution( <modificador> <retorno do método> <classe>.<metodo>(<parametros>))

em todos eles vc pode colocar um *

Lucas_Cavalcanti

isso, se vc quiser adicionar outro interceptor em uma ordem diferente da padrão, é só colocar nessa lista a classe, tirar a anotação @Intercepts e colocar @Component

Yokomizo

O problema é agora não estou conseguindo usar DI no construtor :frowning:

mas eu li em algum post aqui no guj que eu teria que fazer DI pelos setters…

Bom…que seja…

Lucas_Cavalcanti

isso, qqer classe onde o Aspecto vai passar precisa ter um construtor padrão, infelizmente…

Criado 1 de junho de 2010
Ultima resposta 1 de jun. de 2010
Respostas 13
Participantes 2