VRaptor + Generics

4 respostas
P

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    ] couldnt 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

4 Respostas

Lucas_Cavalcanti

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

P

Sim:

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

tenta inverter os tipos genéricos:

<T, B extends Business<T>>
P

Valeu Lucas, deu certo.

Criado 20 de outubro de 2011
Ultima resposta 20 de out. de 2011
Respostas 4
Participantes 2