VRaptor + Generics

Ao realizar o extends da classe abaixo e usar o método “merge” uma exceção é lançada pelo Paranamer. Por qual motivo?

@AllArgsConstructor
public class GenericController <B extends Business<T>, T> {

	@Getter
	private B business;
		
	@Getter
	private Result result;
		
	@Get
	public void index() {
		//Homepage.
	}

	@Post
	public void create(@Valid T entity) {
		Pair<Boolean, String> validation = customValidation(entity);
		
		if(validation.getKey()){
			business.persist(entity);
		}
			
		result.use(ExtJSJson.class).from(validation.getValue()).success(validation.getKey()).serialize();
	}
	
	
	@Get 
	public void retrieve(int limit, int page) {
		result.use(ExtJS4Json.class).from(business.load(limit, page))
									.total(business.getTotal())
									.serialize();
	}
	
	
	@Post
	public void update(@Valid T entity) {
		Pair<Boolean, String> validation = customValidation(entity);
		
		if(validation.getKey()){
			business.update(entity);
		}
		
		result.use(ExtJSJson.class).from(validation.getValue()).success(validation.getKey()).serialize();
	}
		
	@Post 
	public void delete(Long... ids) {		
		business.delete(ids);
		
		result.use(ExtJSJson.class).from("").success().serialize();
	}
	
	@Post
	public void merge(@Valid T entity) {
		Pair<Boolean, String> validation = customValidation(entity);
		
		if(validation.getKey()){
			business.merge(entity);
		}
		
		result.use(ExtJSJson.class).from(validation.getValue()).success(validation.getKey()).serialize();
	}
	
	//Override for custom validations.
	protected Pair<Boolean, String> customValidation(T entity) {
		return Pair.of(true, "");
	}
		
}

LOG
15:02:36,098 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for GenericController.merge(Object) as [entity]
15:02:36,098 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for GenericController.merge(Object) as [entity]

Exceção

15:07:54,791 DEBUG [DefaultResourceTranslator] trying to access /empresa/merge
15:07:54,959 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: GenericController.mergeGenericController.merge(Object)]
15:07:54,959 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
15:07:54,959 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
15:07:54,975 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
15:07:54,975 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor
15:07:54,990 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
15:07:54,990 DEBUG [JstlLocalization ] couldn’t find message bundle, creating an empty one
15:07:54,990 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for GenericController.merge(Object) as [entity]
20/10/2011 15:07:54 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.http.InvalidParameterException: unable to instantiate type T
at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:154)
at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:122)
at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:85)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:105)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:48)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
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:291)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class
at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider$Parameter.actualType(OgnlParametersProvider.java:107)
at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:152)
… 39 more

você está com a última versão do VRaptor?

Sim:

	<!-- VRaptor -->
	<dependency>
	    <groupId>br.com.caelum</groupId>
	    <artifactId>vraptor</artifactId>
	    <version>3.4.0</version>
	</dependency>

tenta inverter os tipos genéricos:

<T, B extends Business<T>>

Valeu Lucas, deu certo.