Possivel problema com VRaptor + MaintainJ

Preciso gerar uns diagramas de sequencia e vou usar o MaintainJ. Já utilizei em outra situação e gostei bastante.
Porém, agora está dando erro junto com o VRaptor. Se inicio o servidor sem o MaintainJ, funciona perfeito. Quando inicio o servidor com o MaintainJ, me da o seguinte erro onde existe result.redirectTo(QualquerClasse.class).algumMetodo();:

br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

java.lang.VerifyError: (class: sigo/controller/OrcamentoController$$EnhancerByCGLIB$$edff75f3, method: init$_aroundBody16 signature: (Lsigo/controller/OrcamentoController$$EnhancerByCGLIB$$edff75f3;Lsigo/model/SessionInfo;Lsigo/model/ApplicationInfo;Lbr/com/caelum/vraptor/Result;Lorg/aspectj/lang/JoinPoint;)V) Unable to pop operand off an empty stack
	sun.reflect.GeneratedSerializationConstructorAccessor27.newInstance(Unknown Source)
	java.lang.reflect.Constructor.newInstance(Unknown Source)
	org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40)
	org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:58)
	br.com.caelum.vraptor.proxy.ObjenesisProxifier.proxify(ObjenesisProxifier.java:32)
	br.com.caelum.vraptor.view.DefaultLogicResult.redirectTo(DefaultLogicResult.java:108)
	br.com.caelum.vraptor.core.AbstractResult.redirectTo(AbstractResult.java:31)
	sigo.controller.LoginController.login_aroundBody4(LoginController.java:43)
	sigo.controller.LoginController$AjcClosure5.run(LoginController.java:1)
	com.maintainj.aspect.ExecutionAspect.ajc$around$com_maintainj_aspect_ExecutionAspect$1$a6875b6bproceed(ExecutionAspect.aj:1)
	com.maintainj.aspect.ExecutionAspect.ajc$around$com_maintainj_aspect_ExecutionAspect$1$a6875b6b(ExecutionAspect.aj:42)
	sigo.controller.LoginController.login(LoginController.java:33)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Na verdade, acho que o problema está no meu interceptor. Porém é simples, segue minha classe:
RequestInterceptor.java

package sigo.interceptor;

import org.hibernate.Session;

import sigo.controller.LoginController;
import sigo.model.ApplicationInfo;
import sigo.model.SessionInfo;
import sigo.model.gestao.PerfilAcesso;
import sigo.model.orcamento.Orcamento;
import sigo.utils.HibernateUtils;
import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.resource.ResourceMethod;

@RequestScoped
@Intercepts
public class RequestInterceptor implements Interceptor
{
	private final Result result;
	private final ApplicationInfo applicationInfo;
	private final SessionInfo sessionInfo;

	public RequestInterceptor(Session session, ApplicationInfo applicationInfo, Result result, SessionInfo sessionInfo)
	{
		this.applicationInfo = applicationInfo;
		this.result = result;
		this.sessionInfo = sessionInfo;
		
		HibernateUtils.setCurrentSession(session);
	}
	
	@Override
	public boolean accepts(ResourceMethod arg0)
	{
		return !(arg0.getMethod().isAnnotationPresent(NotToIntercept.class));
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object instance) throws InterceptionException
	{
		if(sessionInfo.getUsuario() == null)
		{
			result.redirectTo(LoginController.class).index();
		}
		else
		{
			result.include("methodName", method.getMethod().getName());
			result.include("className", method.getResource().getType().getSimpleName());
            result.include("DIRETOR_OPERACOES", PerfilAcesso.DIRETOR_OPERACOES);
            result.include("DIRETOR_PROJETO", PerfilAcesso.DIRETOR_PROJETO);
            result.include("DIRETOR_FINANCEIRO", PerfilAcesso.DIRETOR_FINANCEIRO);
            result.include("GERENTE_PROJETO", PerfilAcesso.GERENTE_PROJETO);
            result.include("FUNCIONARIO", Orcamento.FUNCIONARIO);
            result.include("CARGO", Orcamento.CARGO);
            result.include("applicationInfo", applicationInfo);
            
            stack.next(method, instance);
		}
	}

}

Estou fazendo uns testes pra tentar descobrir o que é, mas se alguém tiver alguma sugestão é muito bem-vinda =)

abs.

EDITADO***
Acabei de testar que dessa forma fuciona:

Ou seja, se tentar dar redirectTo apontando a classe e depois o método, dá algum conflito com o MaintainJ. Se colocar string, funciona.

Sugestões?

eu conheço o funcionamento do MaintainJ, mas ele provavelmente intercepta todas as invocações de método…

quando vc faz a chamada:

result.redirectTo(QualquerClasse.class).algumMetodo();

o vraptor vai criar um proxy da QualquerClasse.class… e esse proxy não é uma classe que já existe, ela eh meio que criada em tempo de execução (sendo bem simplista, não eh bem assim q acontece)…

então por algum motivo o MaintainJ não consegue interceptar os métodos dessa “classe nova” e se perde na lógica dele…

acho que vc deveria abrir um bug report lah no MaintainJ, não tem nada que vc pode fazer do lado do vraptor… (a não ser que vc tire todos os redirecionamentos, mas é meio zuado fazer isso só por causa de uma ferramenta de geração de gráficos)

Olá, Lucas

Sim, vou ter que mudar todos meus redirecionamentos pq preciso entregar a documentação do meu TCC segunda-feira, rsrs

Mas vou abrir o chamado sim no fórum do MaintainJ. Vou ter que explicar a forma que o VRaptor cria esse proxy pro cara poder contornar o problema. Como devo explicar? Falo o que vc disse mesmo, que o VRaptor cria um proxy da classe em tempo de execução e o MaintainJ deve estar se perdendo na lógica?

Obrigado,
André Vendramini

/EDITADO***/
Já enviei e-mail pro desenvolvedor do MaintainJ e ele me respondeu dizendo que vai dar uma olhada com calma e me dar um retorno se realmente é bug dele ou das dependências. Assim que tiver resposta, posto aqui. =)

vc pode falar que o VRaptor cria proxies usando CGLib e Objenesis, e o MaintainJ não está conseguindo interceptar esses proxies, e isso causa alguma falha no processo deles…

Lucas, o Vraptor usa por padrão proxies através da CGLIB. É muito dificil implementar proxies usando JDK proxies ou Javassist? Pergunto mais no sentido, eu, Garcia, posso facilmente fazer isso sobrescrevendo componentes ou é necessário mexer algo nas profundezas do Vraptor?

Abraços

só implementar a interface Proxifier…

JDK Proxies só funcionam pra interfaces… e isso não é suficiente pro vraptor (result.redirectTo(Controller.class) não funcionaria)

a interface Proxifier eh simples de implementar… vc precisa converter o MethodInterceptor do VRaptor pro similar do javassist, criar um proxy usando ele (ignorando os métodos do Object de preferencia) e retornar esse proxy

[]'s

Lucas, valeu. Logo teremos então um proxifier via Javassist.

Abraços

[quote=garcia-jj]Lucas, valeu. Logo teremos então um proxifier via Javassist.

Abraços[/quote]
=D thanks