VRaptor3 + @Aspect: pointcut em um controller

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?

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

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)

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?

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…

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

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);

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…

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(..))")

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

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 *

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

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…

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