Pessoal,
Estou iniciando um novo projeto com o vraptor 3.1.3.
Percebi que agora está suportando herança nos controllers, entao fiz o seguinte:
[code]public class AbstractController{
protected final Repository<T> repository;
protected final Result result;
public AbstractController(Repository<T> repository, Result result) {
this.repository = repository;
this.result = result;
}
public void form() {
...
}
public void list() {
...
}
@Path("/edit/{entity.id}")
public void edit(T entity) {
...
}
@Path("/del")
public void delete(T entity) {
...
}
@Post
@Path("/save")
public void save(T entity) {
...
}
}[/code]
Meus controllers ficaram da seguinte maneira:
[code]public class ClasseController extends AbstractController {
public ClasseController(ClasseRepository repository, Result result) {
super(repository, result);
}
}[/code]
[code]public class MetodoController extends AbstractController {
public MetodoController(MetodoRepository repository, Result result) {
super(repository, result);
}
}[/code]
E tudo funcionava as mil maravilhas…
Ate que resolvi adicionar um metodo de pesquisa Generico (utilizando o Example do Hibernate) no AbstractController.
Assim meu metodo find, ficou:
@Path("/find")
public void find(T entity) throws RepositoryException{
List<T> entityList = new ArrayList<T>();
if (entity.getId() > 0) {
entityList.add( repository.findById(entity.getId()) );
} else {
entityList.addAll( repository.findByExample(entity) );
}
...
}
Resultado: O findById funciona e o findByExample nao (apenas para o metodo find do abstract controller).
Debugando, percebi que ao passar o id, o objeto entity corresponde a classe correta. Ao chamar o findByExample o entity vem com um objeto errado.
O exemplo da view:
<form method="post" action="$base/classe/find">
<fieldset>
<legend>Buscar</legend>
<label>Código</label>
<input type="text" name="entity.id"/>
<label>Nome</label>
<input type="text" name="entity.nome"/>
<input type="submit" value="OK"/>
</fieldset>
</form>
<form method="post" action="$base/metodo/find">
<fieldset>
<legend>Buscar</legend>
<label>Código</label>
<input type="text" name="entity.id"/>
<label>Nome</label>
<input type="text" name="entity.nome"/>
<input type="submit" value="OK"/>
</fieldset>
</form>
Detalhe: Ao parar o servidor, vai funcionar o example com o primeiro form que eu tentar. Na segunda tentativa, se eu tentar o example no segundo form, vai dar o erro (java.lang.ClassCastException):
Buscando o Objeto Classe, o cast foi dado para “Metodo”
17:00:57,979 DEBUG [OgnlParametersProvider] Applying entity.nome with [Administrador]
17:00:57,987 DEBUG [OgnlParametersProvider] Applying entity.id with []
17:00:57,990 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for AbstractController.find(Persistent) as [entity]
17:00:57,991 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: AbstractController.findAbstractController.find(Persistent)] are [admin.dominio.Metodo@3caf7a1f]
17:00:58,013 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
17:00:58,014 DEBUG [ExecuteMethodInterceptor] Invoking AbstractController.find(Persistent)
br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
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:65)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at arq.infra.ErrorInterceptor.intercept(ErrorInterceptor.java:34)
at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
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:65)
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:65)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
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:242)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:163)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:556)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:401)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:267)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:245)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:260)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassCastException: admin.dominio.Metodo
at org.hibernate.criterion.Example.getEntityMode(Example.java:279)
at org.hibernate.criterion.Example.toSqlString(Example.java:209)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:380)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:114)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:83)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:92)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1687)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
at arq.hibernate.GenericDao.findByExample(GenericDao.java:108)
at arq.controller.AbstractController.find(AbstractController.java:89)
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)
Errei em algum ponto, ou algum bug (algo que o vrpator nao suporta ainda) detectado?