Entretanto, se eu faço um redirect de algum outro método, da maneira a baixo, o type é nulo, e se eu uso-o, naturalmente, eu obtenho um NullPointerException.
maruero, não consegui reproduzir o bug… que versão vc está usando do vraptor?
maruero
3.2.0
Estranho.
Eu coloquei um Interceptor apenas para verificar se o parâmetro está sendo passado corretamente, e no construtor do interceptor eu recebo um MethodInfo com um Type dentro.
Apenas no controller mesmo que o parâmetro fica nulo. Como se o VRaptor não soubesse interpretá-lo antes de chamar o método paymento do controller.
Vou continuar procurando possiveis erros.
Lucas_Cavalcanti
vc consegue reproduzir esse erro a partir do blank-project do vraptor?
maruero
Consegui reproduzir o erro no black_project e descobrir a fonte do problema, mas tive que fazer várias alterações.
O problema começa ocorrer quando eu implemento uma InterceptorSequence definindo nela o ParametersInstantiatorInterceptor como primeiro Interceptor a ser executado.
Preciso disso, pois tenho um outro Interceptor (responsável por disponibilizar a tela de login ao usuário quando este tenta acessar páginas de acesso restrito, e após o login dá um forward ao controller original requisitado pelo usuário) que necessita conhecer os parâmetros passados da JSP para os Controllers.
Alguem tem uma sugestão de consertar meu problema?
Lucas_Cavalcanti
entendi.
Se vc coloca o ParametersInstantiatorInterceptor num InterceptorSequence ele é registrado duas vezes. Por isso o nullPointer.
na próxima versão do VRaptor que sairá em breve, você pode fazer simplesmente:
A idéia era deixar a sequencia assim:
ParametersInstantiationInterceptor -> Exceptions -> Initialization -> Login -> Controllers.
A sequencia está sendo respeitada, mas, estranhamente, os Controllers são instanciados antes de ser interceptados.
Ou seja, os construtores dos controllers executam antes dos Interceptors, isso está certo?
Isso está quebrando um pouco a idéia do meu InitializationInterceptor que é recuperar os parâmetros do contexto e colocá-los na sessão, para que os construtores dos controllers possam configurar os controllers durante o processo de inicialização.
Lucas_Cavalcanti
coloca o que precisa rodar antes de instanciar o controller com before=InstantiatorInterceptor.class…
por padrão ele só é antes de executar o método, não necessariamente antes de instanciar o controller