[resolvido] Vraptor - Redirecionamento para logic retorna IllegalArgumentException:

Ao efetuar o redirect em meu controller para outro método da mesma classe conforme código abaixo retorna IllegalArgumentException (stacktrace completo no final).

[code]@Resource
public class DashboardController {

public void index() {
	[...]
}

public void changeProfile(int index) {
	[...]

	result.use(Results.logic()).redirectTo(DashboardController.class).index();
}

}[/code]

Analisando o código cheguei na classe DefaultLogicResult, onde no método abaixo tenta setar um proxy da classe.

private <T> void includeParametersInFlash(final Class<T> type, Method method, Object[] args) { Object params = creator.instanceWithParameters(DefaultResourceMethod.instanceFor(type, method), args); request.getSession().setAttribute(FLASH_PARAMETERS, params); }

É um possível bug do vraptor ou estou fazendo algo errado?

Ambiente:

  • vraptor rc1
  • glassfish v2

[quote]SEVERE: StandardWrapperValve[default]: PWC1406: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: java.lang.IllegalArgumentException: PWC2788: setAttribute: Non-serializable attribute with name _vraptor_flash_parameters
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:84)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:54)
at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
at br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:58)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:58)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
at br.com.caelum.vraptor.core.URLParameterExtractorInterceptor.intercept(URLParameterExtractorInterceptor.java:45)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:70)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99)
at br.com.caelum.vraptor.ioc.pico.PicoProvider.provideForRequest(PicoProvider.java:196)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288)
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647)
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579)
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
at com.sun.enterprise.web.connector.grizzly.ssl.SSLReadTask.process(SSLReadTask.java:440)
at com.sun.enterprise.web.connector.grizzly.ssl.SSLReadTask.doTask(SSLReadTask.java:228)
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
Caused by: java.lang.IllegalArgumentException: PWC2788: setAttribute: Non-serializable attribute with name _vraptor_flash_parameters
at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1639)
at org.apache.catalina.session.StandardSessionFacade.setAttribute(StandardSessionFacade.java:179)
at br.com.caelum.vraptor.view.DefaultLogicResult.includeParametersInFlash(DefaultLogicResult.java:103)
at br.com.caelum.vraptor.view.DefaultLogicResult.access$700(DefaultLogicResult.java:54)
at br.com.caelum.vraptor.view.DefaultLogicResult$2.intercept(DefaultLogicResult.java:114)
at br.com.caelum.vraptor.proxy.ObjenesisProxifier$2.intercept(ObjenesisProxifier.java:45)
at test.web.controller.my.DashboardController$$EnhancerByCGLIB$$3d914c6c.index()
at test.web.controller.my.DashboardController.change(DashboardController.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:62)
… 58 more
[/quote]

Olá,

Você fez isso direitinho… o problema é que o VRaptor coloca uma classe na Sessão que guarda os parâmetros
para o método que você está redirecionando, para suportar a passagem de parâmetros…
a gente não tinha testado isso no Glassfish… no Tomcat e no Jetty isso funciona sem problemas…

aparentemente o HttpSession do Glassfish só aceita atributos serializáveis, um pouco estranho…

Vamos verificar isso, e se possível corrigir até o proximo release (que já está chegando)

[]'s

Lucas, obrigado.

Se você precisar de algum teste, por favor, envie-me MP. Estou migrando uma aplicação minha que utiliza atualmente vraptor2. Por enquanto tudo funcionando bem.

Há algum workaroud temporário enquanto sai o novo release?

Abraços

Você está com o source do VRaptor3 aí né?

Pegue a classe:
br.com.caelum.vraptor.view.DefaultLogicResult

crie essa classe:

@Component
public class MeuLogicResult implements LogicResult {
   // conteúdo da DefaultLogicResult
}

remova o método includeParametersInFlash e todas as suas chamadas…

o vraptor vai usar agora essa sua classe ao invés da dele…
O efeito colateral de fazer isso, é que se você fizer:

result.use(logic()).redirectTo(ClientsController.class).view(client);

o parâmetro client não vai ser usado no redirecionamento…

[]