VRaptor 3 + GenericController [RESOLVIDO]

[quote=Lucas Cavalcanti]ah, entendi qual é o problema…

se vc mandar os parâmetros da requisição como object ao invez de cadIndexador funciona? (object é o nome do parametro no generic controller

se sim, tire a sua customização do método getParametersFor, vá no método createViaOgnl, e depois da linha

String key = (String) enumeration.nextElement();

faça

key = key.replaceFirst("cadIndexador", "object");

se funcionar, troque esse cadIndexador pelo Util.extractGenericLogic(method.getResource().getType()).toLowerCase();[/quote]

Lucas e isso mesmo so que tem outro detalhe agora esta dando esta exception ate imagino pq

java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity

devido ao meu metodo no GenericController.adiciona(T obj) estar assim como que faco para ele enteder T = CadIndexador.

Obrigado !!!
JVDS

chega a dar algum erro?

posta o método createViaOgnl aqui por favor?

[quote=Lucas Cavalcanti]chega a dar algum erro?

posta o método createViaOgnl aqui por favor?[/quote]

A Exception e esta

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:90)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:637)
Caused by: java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity
	at org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:63)
	at org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:46)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
	at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:686)
	at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:1)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
	at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
	at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
	at br.com.jvds.telecon.spring.dao.DaoHibernateSpring.adiciona(DaoHibernateSpring.java:34)
	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 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy20.adiciona(Unknown Source)
	at br.com.jvds.telecon.controller.GenericoController.adiciona(GenericoController.java:47)
	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:57)
	... 40 more

ja a classe la CustomOgnlParametersProvider com metodo com jeito que vc me pediu

	private Object createViaOgnl(ResourceMethod method, List<Message> errors, ResourceBundle bundle) {
		Class<?> type = creator.typeFor(method);
		Object root;		
		type = creator.typeFor(method);
		try {
			root = type.getDeclaredConstructor().newInstance();
		} catch (Exception ex) {
			throw new InvalidParameterException("unable to instantiate type" + type.getName(), ex);
		}
		
		OgnlContext context = (OgnlContext) Ognl.createDefaultContext(root);
		context.setTraceEvaluations(true);
		context.put(Container.class, this.container);

		VRaptorConvertersAdapter adapter = new VRaptorConvertersAdapter(converters, bundle);
		Ognl.setTypeConverter(context, adapter);
		for (Enumeration<?> enumeration = request.getParameterNames(); enumeration.hasMoreElements();) {
			String key = (String) enumeration.nextElement();
			//JVDS
			if (method.getMethod().getName().equals("adiciona")) {
				key = key.replaceFirst("obj", Util.extractGenericLogic(method.getResource().getType()).toLowerCase());
			}
			//
			String[] values = request.getParameterValues(key);
			try {
				if (logger.isDebugEnabled()) {
					logger.debug("Applying " + key + " with " + Arrays.toString(values));
				}
				Ognl.setValue(key, context, root, values.length == 1 ? values[0] : values);
			} catch (ConversionError ex) {
				errors.add(new ValidationMessage(ex.getMessage(), key));
			} catch (MethodFailedException e) { // setter threw an exception

				Throwable cause = e.getCause();
				if (cause.getClass().isAnnotationPresent(ValidationException.class)) {
					errors.add(new ValidationMessage(cause.getLocalizedMessage(), key));
				} else {
					throw new InvalidParameterException("unable to parse expression '" + key + "'", e);
				}

			} catch (NoSuchPropertyException ex) {
				// TODO optimization: be able to ignore or not
				if (logger.isDebugEnabled()) {
					logger.debug("cant find property for expression {} ignoring", key);
				}
				if (logger.isTraceEnabled()) {
					logger.trace("cant find property for expression " + key + ", ignoring. Reason:", ex);

				}
			} catch (OgnlException e) {
				// TODO it fails when parameter name is not a valid java
				// identifier... ignoring by now
				if (logger.isDebugEnabled()) {
					logger.debug("unable to parse expression '" + key + "'. Ignoring", e);
				}
			}
		}		
		return root;
	}

Obrigado !!!
JVDS

Lucas ate achei uma solução mas não gostei muito acho que da pra melhorar

@Component
@RequestScoped
public class CustomOgnlParametersProvider extends OgnlParametersProvider {
	private final TypeCreator creator;

	private final Container container;

	private final Converters converters;

	private final ParameterNameProvider provider;

	private static final Logger logger = LoggerFactory.getLogger(OgnlParametersProvider.class);

	private final HttpServletRequest request;

	private final EmptyElementsRemoval removal;
	
	public CustomOgnlParametersProvider(TypeCreator creator,
			Container container, Converters converters,
			ParameterNameProvider provider, HttpServletRequest request,
			EmptyElementsRemoval removal) {
		super(creator, container, converters, provider, request, removal);
		// TODO Auto-generated constructor stub
		this.creator = creator;
		this.container = container;
		this.converters = converters;
		this.provider = provider;
		this.request = request;
		this.removal = removal;	
		OgnlRuntime.setNullHandler(Object.class, new ReflectionBasedNullHandler());
		OgnlRuntime.setPropertyAccessor(List.class, new ListAccessor());
		OgnlRuntime.setPropertyAccessor(Object[].class, new ArrayAccessor());		
	}

	@Override
	public Object[] getParametersFor(ResourceMethod method, List<Message> errors, ResourceBundle bundle) {
		Object root = createRoot(method, errors, bundle);
		removal.removeExtraElements();
		Type[] types = method.getMethod().getGenericParameterTypes();
		Object[] result = new Object[types.length];
		String[] names = provider.parameterNamesFor(method.getMethod());
		//JVDS
		if (method.getMethod().getName().equals("adiciona")) {
			names[0] = Util.extractGenericLogic(method.getResource().getType()).toLowerCase();
		}
		//
		for (int i = 0; i < types.length; i++) {
			try {
				result[i] = root.getClass().getMethod("get" + Info.capitalize(names[i])).invoke(root);
			} catch (InvocationTargetException e) {
				throw new InvalidParameterException("unable to retrieve values to invoke method", e.getCause());
			} catch (Exception e) {
				throw new InvalidParameterException("unable to retrieve values to invoke method", e);
			}
		}
		return result;
	}

	private Object createRoot(ResourceMethod method, List<Message> errors, ResourceBundle bundle) {
		return createViaOgnl(method, errors, bundle);
	}

	private Object createViaOgnl(ResourceMethod method, List<Message> errors, ResourceBundle bundle) {
		Class<?> type = creator.typeFor(method);
		Object root;		
		//JVDS
		try {
			if (method.getMethod().getName().equals("adiciona")) {
				root = Class.forName(method.getResource().getType().getName()).getDeclaredConstructor(Result.class,Validator.class,DaoGenerico.class).newInstance(null,null,null);
			} else {
				root = type.getDeclaredConstructor().newInstance();
			}
		} catch (Exception ex) {
			throw new InvalidParameterException("unable to instantiate type" + type.getName(), ex);
		}
		//
		
		OgnlContext context = (OgnlContext) Ognl.createDefaultContext(root);
		context.setTraceEvaluations(true);
		context.put(Container.class, this.container);

		VRaptorConvertersAdapter adapter = new VRaptorConvertersAdapter(converters, bundle);
		Ognl.setTypeConverter(context, adapter);
		for (Enumeration<?> enumeration = request.getParameterNames(); enumeration.hasMoreElements();) {
			String key = (String) enumeration.nextElement();
			//JVDS
			/*
			if (method.getMethod().getName().equals("adiciona")) {
				key = key.replaceFirst("obj", Util.extractGenericLogic(method.getResource().getType()).toLowerCase());
			}
			*/
			//
			String[] values = request.getParameterValues(key);
			try {
				if (logger.isDebugEnabled()) {
					logger.debug("Applying " + key + " with " + Arrays.toString(values));
				}
				Ognl.setValue(key, context, root, values.length == 1 ? values[0] : values);
			} catch (ConversionError ex) {
				errors.add(new ValidationMessage(ex.getMessage(), key));
			} catch (MethodFailedException e) { // setter threw an exception

				Throwable cause = e.getCause();
				if (cause.getClass().isAnnotationPresent(ValidationException.class)) {
					errors.add(new ValidationMessage(cause.getLocalizedMessage(), key));
				} else {
					throw new InvalidParameterException("unable to parse expression '" + key + "'", e);
				}

			} catch (NoSuchPropertyException ex) {
				// TODO optimization: be able to ignore or not
				if (logger.isDebugEnabled()) {
					logger.debug("cant find property for expression {} ignoring", key);
				}
				if (logger.isTraceEnabled()) {
					logger.trace("cant find property for expression " + key + ", ignoring. Reason:", ex);

				}
			} catch (OgnlException e) {
				// TODO it fails when parameter name is not a valid java
				// identifier... ignoring by now
				if (logger.isDebugEnabled()) {
					logger.debug("unable to parse expression '" + key + "'. Ignoring", e);
				}
			}
		}		
		return root;
	}
}

no CadIndexadorController

@Resource
public class CadIndexadorController extends GenericoController<CadIndexador> {
	private CadIndexador cadindexador;
	
	public CadIndexadorController(Result result, Validator validator,
			DaoGenerico daoGenerico) {
		super(result, validator, daoGenerico);
		// TODO Auto-generated constructor stub
	}	
	
	public CadIndexador getCadindexador() {
		return cadindexador;
	}
	
	public void setCadindexador(CadIndexador cadindexador) {
		this.cadindexador = cadindexador;
	}
}

mas acho que se na hora que sobe aplicacao ele ja codificava T = CadIndexador ficaria show de bola ai nao precisaria acho eu nem declarar entidade,getter e o setter no controller

Ve se consegue uma ideia bizarra valeu.

tira o jvds do getParametersFor, ele não é necessário…

de qqer forma, se vc for ter que fazer essa gambi, é melhor apagar o CustomXXX e sobrescrever o método adiciona mesmo…

essa parte do Ognl e do TypeCreator provavelmente vai ser substituida nas próximas versões do VRaptor, justamente pq ela é mto zuada de mudar

[quote=Lucas Cavalcanti]tira o jvds do getParametersFor, ele não é necessário…

de qqer forma, se vc for ter que fazer essa gambi, é melhor apagar o CustomXXX e sobrescrever o método adiciona mesmo…

essa parte do Ognl e do TypeCreator provavelmente vai ser substituida nas próximas versões do VRaptor, justamente pq ela é mto zuada de mudar[/quote]

Lucas estou usando sim getParametersFor olha para vc comentario //JVDS se eu tirar nao rola mais, entao a solucao e voltar mesmo no que estava nao tem outro jeito de fazer mesmo em vez de trablhar com este classe usar outra classe.

vai ter um jeito melhor assim que eu refatorar essa parte do VRaptor (creio que pra próxima versão)…

heranças e tipos genéricos ferram algumas das coisas que o VRaptor faz, pq o java apaga as informações de vez em quando, mas a gente vai fazer isso funcionar

[]'s

[quote=Lucas Cavalcanti]vai ter um jeito melhor assim que eu refatorar essa parte do VRaptor (creio que pra próxima versão)…

heranças e tipos genéricos ferram algumas das coisas que o VRaptor faz, pq o java apaga as informações de vez em quando, mas a gente vai fazer isso funcionar

[]'s[/quote]

Ok valeu ai pela atencao se sair alguma snapshot me avise.

Obrigado !!!
JVDS

olá de novo jvds,

fiz aquela refatoração que eu falei, e gerei o snapshot:

https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.2.1-SNAPSHOT/vraptor-3.2.1-20101104.214412-6.jar

testa pra mim por favor?

um problema que vc vai ter por enquanto é gerar os nomes dos parametros corretamente, mas daí vc pode sobrescrever o ParameterNamesProvider

[]'s

[quote=Lucas Cavalcanti]olá de novo jvds,

fiz aquela refatoração que eu falei, e gerei o snapshot:

https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.2.1-SNAPSHOT/vraptor-3.2.1-20101104.214412-6.jar

testa pra mim por favor?

um problema que vc vai ter por enquanto é gerar os nomes dos parametros corretamente, mas daí vc pode sobrescrever o ParameterNamesProvider

[]'s[/quote]

Lucas, deu certo so nao sei ainda como vou pegar o nome da classe outro detalhe tem que extender ParanamerNameProvider certo

@Component
@ApplicationScoped
public class CustomParameterNamesProvider extends ParanamerNameProvider {
	@Override
	public String[] parameterNamesFor(AccessibleObject arg0) {
		// TODO Auto-generated method stub
		return new String[]{"cadindexador"};
	}
}

Mas ficou muito bom

Obrigado !!!
JVDS

a classe é a ParanamerNameProvider mesmo…

mas nesse ponto vc não vai conseguir saber qual é a classe certa =(

o que vc pode fazer é criar um interceptor que “corrige” o nome dos parâmetros…

suponha que o nome do parametro do seu generic controller é entity:

@Intercepts
public class GenericControllerInterceptor implements Interceptor {

     public GenericControllerInterceptor(MutableRequest request) {...} //do VRaptor
 
     public boolean accept(ResourceMethod method) {
          return GenericController.class.isAssignableFrom(method.getResource().getType());
     }


     public void intercept(....) {
          Map<String, String[]> parameters = new HashMap(this.request.getParameterMap()); //cópia defensiva
          String className = //extraia o nome da classe a partir do ResourceMethod
          for(Entry<String, String[]> param : parameter) {
                if (param.getKey().startsWith(className) {
                    request.setParameter(param.getKey().replaceFirst(className, "entity"), param.getValue());
                }
          }
          stack.next(...);
     }
}

creio que isso resolva, testa por favor?

[quote=Lucas Cavalcanti]a classe é a ParanamerNameProvider mesmo…

mas nesse ponto vc não vai conseguir saber qual é a classe certa =(

o que vc pode fazer é criar um interceptor que “corrige” o nome dos parâmetros…

suponha que o nome do parametro do seu generic controller é entity:

@Intercepts
public class GenericControllerInterceptor implements Interceptor {

     public GenericControllerInterceptor(MutableRequest request) {...} //do VRaptor
 
     public boolean accept(ResourceMethod method) {
          return GenericController.class.isAssignableFrom(method.getResource().getType());
     }


     public void intercept(....) {
          Map<String, String[]> parameters = new HashMap(this.request.getParameterMap()); //cópia defensiva
          String className = //extraia o nome da classe a partir do ResourceMethod
          for(Entry<String, String[]> param : parameter) {
                if (param.getKey().startsWith(className) {
                    request.setParameter(param.getKey().replaceFirst(className, "entity"), param.getValue());
                }
          }
          stack.next(...);
     }
}

creio que isso resolva, testa por favor?[/quote]

Lucas e isso ai meu ficou show de bola

@Intercepts
@RequestScoped
public class GenericControllerInterceptor implements Interceptor {
	private final MutableRequest request;
	
	public GenericControllerInterceptor(MutableRequest request) {
		// TODO Auto-generated constructor stub
		this.request = request;
	}
	
	@Override
	public boolean accepts(ResourceMethod method) {
		// TODO Auto-generated method stub
		return GenericController.class.isAssignableFrom(method.getResource().getType());
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object obj) throws InterceptionException {
		// TODO Auto-generated method stub
		Map<String, String[]> parameters = new HashMap(this.request.getParameterMap()); //cópia defensiva
        String className = Util.extractGenericLogic(method.getResource().getType()).toLowerCase();	//nome que vai ficar objeto
		for(Entry<String, String[]> param : parameters.entrySet()) {
            if (param.getKey().startsWith(className)) {
                this.request.setParameter(param.getKey().replaceFirst(className, "entity"), param.getValue());
            }
		}
		stack.next(method, obj);
	}
}

Isso vai sair na versão 3.2.1-stable do vraptor certo ?

Obrigado !!!
JVDS

Sim, mas é importante que vc me avise se aparecer algum bug que possa estar relacionado a essa refatoração que eu fiz (ex: parâmetros não sendo populados, exceptions no começo da requisição, etc)

Abraços e boa sorte aí =)

[quote=Lucas Cavalcanti][quote=jvds@bol.com.br]
Isso vai sair na versão 3.2.1-stable do vraptor certo ?
[/quote]

Sim, mas é importante que vc me avise se aparecer algum bug que possa estar relacionado a essa refatoração que eu fiz (ex: parâmetros não sendo populados, exceptions no começo da requisição, etc)

Abraços e boa sorte aí =)[/quote]

Blz se surgir algum bug te aviso.

Obrigado !!!
JVDS

[quote=jvds@bol.com.br][quote=Lucas Cavalcanti][quote=jvds@bol.com.br]
Isso vai sair na versão 3.2.1-stable do vraptor certo ?
[/quote]

Sim, mas é importante que vc me avise se aparecer algum bug que possa estar relacionado a essa refatoração que eu fiz (ex: parâmetros não sendo populados, exceptions no começo da requisição, etc)

Abraços e boa sorte aí =)[/quote]

Blz se surgir algum bug te aviso.

Obrigado !!!
JVDS[/quote]

Olha quando fui atualizar para o VRaptor-3.4.1 tive um surpresa simplesmente parou de funcionar GenericController junto com GenericControllerInteceptor voce saberia me dizer o que esta acontecendo.

Simplesmente esta perdendo os dados do objeto no meio do caminho ou seja me parece que o vraptor esta instanciando novamente o objeto.

explica um pouco melhor…

qual objeto tá perdendo os dados? quem está sendo instanciado novamente?

Ja em GenericControllerInterceptor no metodo esta com o objeto carregado com os valores inputados vindo da web

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object obj) throws InterceptionException {
		// TODO Auto-generated method stub
		Map<String, String[]> parameters = new HashMap(this.request.getParameterMap()); //cópia defensiva
        String className = Util.extractGenericLogic(method.getResource().getType()).toLowerCase();	//nome que vai ficar objeto
		for(Entry<String, String[]> param : parameters.entrySet()) {
            if (param.getKey().startsWith(className)) {
                this.request.setParameter(param.getKey().replaceFirst(className, "obj"), param.getValue());
            }
		}
		stack.next(method, obj);
	}

Aqui o objeto esta chegando instanciado sem os valores
O GenericController tipo exemplo esta desta forma

	@Post
	public void adiciona(final T obj) {
		// TODO Auto-generated method stub
		this.daoGenerico.getDao().adiciona(obj);
	}

Nao sei se vai ajudar muito sera que pode ser esta classe que esta fazendo alguma coisa aqui “br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor” na linha 61 estou tentando debugar o codigo do vraptor.

Obrigado !!!
JVDS

anote o interceptor com:

@Intercepts(before=ParametersInstantiatorInterceptor.class)

[quote=Lucas Cavalcanti]anote o interceptor com:

@Intercepts(before=ParametersInstantiatorInterceptor.class) [/quote]

Ok resolveu qual a explicacao realmente ele estava instanciando o obj mesmo.

dependendo da versão que você tinha do vraptor, ele ordenava os interceptors aleatoriamente, daí por acaso estava funcionando.

Esse seu interceptor precisa rodar antes do interceptor do VRaptor que popula os parâmetros do controller. Nos vraptors mais novos existe esse before= pra forçar a ordem de execução dos interceptors.