[resolvido] Vraptor - Redirecionamento para logic retorna IllegalArgumentException:

3 respostas
G

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

@Resource
public class DashboardController {

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

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

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

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

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

3 Respostas

Lucas_Cavalcanti

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

G

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

Lucas_Cavalcanti

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…

[]

Criado 26 de setembro de 2009
Ultima resposta 27 de set. de 2009
Respostas 3
Participantes 2