[RESOLVIDO] Problemas com V|Raptor 3.2.0 + PicoContainer + ...vraptor.util.jpa.JPACustomProvider

2 respostas
softwork
Pessoal! Estou iniciando um novo projeto utilizando a última versão do V|Raptor em conjunto do PicoContainer e o Componente Opcional JPACustomProvider, porém ao mapear o componente no web.xml, recebo a seguinte exception:
01/12/2010 10:56:14 org.apache.catalina.core.StandardContext filterStart
GRAVE: Exception starting filter vraptor
javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/springframework/web/context/request/RequestContextListener
	at br.com.caelum.vraptor.config.BasicConfiguration.getProvider(BasicConfiguration.java:75)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:103)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
	at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637)
	at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:563)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:498)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
	at org.apache.catalina.core.StandardService.start(StandardService.java:519)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.NoClassDefFoundError: org/springframework/web/context/request/RequestContextListener
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.<init>(SpringProvider.java:37)
	at br.com.caelum.vraptor.util.jpa.JPACustomProvider.<init>(JPACustomProvider.java:45)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at br.com.caelum.vraptor.config.BasicConfiguration.getProvider(BasicConfiguration.java:73)
	... 28 more
Caused by: java.lang.ClassNotFoundException: org.springframework.web.context.request.RequestContextListener
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
	... 35 more
01/12/2010 10:56:14 org.apache.catalina.core.StandardContext start
GRAVE: Error filterStart
01/12/2010 10:56:14 org.apache.catalina.core.StandardContext start
GRAVE: Context [/csr] startup failed due to previous errors
01/12/2010 10:56:14 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
GRAVE: The web application [/csr] registered the JBDC driver [org.postgresql.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Minha lista de bibliotecas:
antlr-2.7.6.jar
cglib-nodep-2.1_3.jar
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
displaytag-1.2.jar
displaytag-portlet-1.2.jar
dom4j-1.6.1.jar
genericdao-1.0.jar
google-collect-1.0.jar
hibernate-3.5.6.Final.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
hibernate-validator-4.1.0.Final.jar
javassist-3.9.0.GA.jar
jstl-api-1.2.jar
jstl-impl-1.2.jar
jta-1.1.jar
log4j-1.2.15.jar
mirror-1.5.1.jar
objenesis-1.1.jar
ognl-2.7.3.jar
paranamer-2.2.jar
picocontainer-2.8.jar
postgresql-9.0-801.jdbc4.jar
scannotation-1.0.2.jar
servlet-api-2.5.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
validation-api-1.0.0.GA.jar
vraptor-3.2.0.jar
xstream-1.3.1.jar
Meu web.xml esta assim:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID"
    version="2.5">
    <display-name>csr</display-name>

    <!-- CONTEXT Configuration -->
    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
        <param-value>messages</param-value>
    </context-param>
    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
        <param-value>pt_BR</param-value>
    </context-param>
    <context-param>  
        <description>V|Raptor handles HTTP requests in ISO-8859-1 format</description>  
        <param-name>br.com.caelum.vraptor.encoding</param-name>  
        <param-value>ISO-8859-1</param-value>  
    </context-param>
    <context-param>
        <param-name>br.com.caelum.vraptor.provider</param-name>
        <param-value>br.com.caelum.vraptor.util.jpa.JPACustomProvider</param-value>
    </context-param>
    
    <!-- STARTUP Configuration -->
    <servlet>
        <servlet-name>StartUp</servlet-name>
        <servlet-class>br.com.faespsenar.csr.servlet.StartUp</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>StartUp</servlet-name>
        <url-pattern>/startUp</url-pattern>
    </servlet-mapping>

    <!-- FILTER Configuration -->
    <filter>
        <filter-name>vraptor</filter-name>
        <filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>vraptor</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <!-- JSP Configuration -->
    <jsp-config>
        <jsp-property-group>
            <display-name>Coloca cabeçalhos e rodapés em todos os jsp´s</display-name>
            <url-pattern>*.jsp</url-pattern>
            <include-prelude>/WEB-INF/jsp/header.jspf</include-prelude>
            <include-coda>/WEB-INF/jsp/footer.jspf</include-coda>
        </jsp-property-group>
    </jsp-config>

</web-app>
NOTA: Não estou utilizando o Spring framework. Então comentei o código referente ao mapeamento do componente para que fosse possível levantar a minha aplicação e em seguida efetuar um teste no primeiro controller, mas ai, ao acessar a URL, recebi outra exception:
GRAVE: Servlet.service() for servlet default threw exception
org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependenciesException: br.com.faespsenar.csr.controller.UsuarioController has unsatisfied dependency: class br.com.faespsenar.csr.dao.DAOFactory among unsatisfiable dependencies: [[class br.com.faespsenar.csr.dao.DAOFactory, interface br.com.caelum.vraptor.Result, interface javax.servlet.http.HttpServletRequest]] where org.picocontainer.DefaultPicoContainer@6c44c5:72<I>&lt;org.picocontainer.DefaultPicoContainer@1e9c3f:1&gt;<I>&lt;org.picocontainer.DefaultPicoContainer@16ff7a:77&gt;&lt;| was the leaf container being asked for dependencies.
	at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:156)
	at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:184)
	at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:289)
	at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:229)
	at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:66)
	at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:92)
	at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:607)
	at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:572)
	at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:580)
	at br.com.caelum.vraptor.ioc.pico.PicoBasedContainer.instanceFor(PicoBasedContainer.java:39)
	at br.com.caelum.vraptor.ioc.pico.PicoProvider$1.instanceFor(PicoProvider.java:78)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	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.pico.PicoProvider.provideForRequest(PicoProvider.java:181)
	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(Unknown Source)
Meu código do UsuiarioController.java
...
...
...
@Resource
public class UsuarioController {
    
    private final DAOFactory         dao;
    private final Result             result;
    private final HttpServletRequest request;
    
    public UsuarioController(DAOFactory daoFactory, Result result, HttpServletRequest request) {
        this.dao = daoFactory;
        this.result = result;
        this.request = request;
    }
...
...
...
}
Meu código DAOFactory.java
public class DAOFactory {
    
    protected final &lt;T&gt; GenericDAO&lt;T&gt; getDao(Class&lt;T&gt; classe) {
        return new GenericDAO&lt;T&gt;(classe);
    }

    public UsuarioDAO getUsuarioDAO() {
        return new UsuarioDAO();
    }

    public GenericDAO&lt;Grupo&gt; getGrupoDAO() {
        return getDao(Grupo.class);
    }
}
Meu código do GenericDAO.java
public class GenericDAO&lt;T&gt; {
    
    private EntityManager      manager;
    private Class&lt;? extends T&gt; classe;
    
    public GenericDAO(Class&lt;? extends T&gt; classe) {
        this.manager = JPAFactory.getEntityManager();
        this.classe = classe;
    }
    
    public final T insert(T entity) {
        // this.manager.getTransaction().begin();
        this.manager.persist(entity);
        // this.manager.getTransaction().commit();
        return (T) entity;
    }
    
    public final T update(T entity) {
        // this.manager.getTransaction().begin();
        this.manager.merge(entity);
        // this.manager.getTransaction().commit();
        return (T) entity;
    }
    
    public final void delete(T entity) {
        this.remove(entity);
    }

    public final Collection&lt;T&gt; listAll() {
        return this.manager.createQuery(&quot;from &quot; + classe.getName()).getResultList();
    }

    public final Integer recordCount() {
        return (Integer) criaCriteria().setProjection(Projections.rowCount()).uniqueResult();
    }
...
...
...
}
Meu código JPAFactory.java
public class JPAFactory {
    
    private static EntityManagerFactory entityManagerFactory;
    
    private JPAFactory() {};
    
    public static EntityManager getEntityManager() {
        if (entityManagerFactory  == null)
            entityManagerFactory  = Persistence.createEntityManagerFactory(&quot;default&quot;);
        return entityManagerFactory.createEntityManager();
    }	

    public static EntityManager getEntityManager(final String persistenceUnitName) {
        return Persistence.createEntityManagerFactory(persistenceUnitName).createEntityManager();
    }	
}
Meu arquivo persistence.xml:
&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
&lt;persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"&gt;
    &lt;persistence-unit name="default"&gt;
        &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;

        &lt;!-- Aqui é o local onde as Entidades devem ser mapeadas --&gt;
        &lt;class&gt;br.com.faespsenar.csr.entity.Grupo&lt;/class&gt;
        &lt;class&gt;br.com.faespsenar.csr.entity.Usuario&lt;/class&gt;

        &lt;properties&gt;
           &lt;property name="hibernate.dialect"                 value="br.com.faespsenar.csr.utilities.CustomPostgreSQLDialect" /&gt;
           &lt;property name="hibernate.connection.url"          value="jdbc:postgresql://localhost:5432/pg_csr" /&gt;
           &lt;property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /&gt;
            
           &lt;property name="hibernate.connection.username"     value="..." /&gt;
           &lt;property name="hibernate.connection.password"     value="..." /&gt;
    
           &lt;property name="hibernate.bytecode.use_reflection_optimizer" value="true" /&gt;
           &lt;property name="hibernate.show_sql"                          value="true" /&gt;
           &lt;property name="hibernate.format_sql"                        value="true" /&gt;
           &lt;property name="hibernate.hbm2ddl.auto"                      value="update" /&gt;
            
           &lt;!-- # Cache de Segundo nivel habilitado (Chace de consulta repetidas) # --&gt;
           &lt;!--  
           &lt;property name="hibernate.cache.provider_class"         value="org.hibernate.cache.EhCacheProvider" /&gt;
           &lt;property name="hibernate.cache.use_query_cache"        value="true" /&gt;
           &lt;property name="hibernate.cache.use_structured_entries" value="true" /&gt;
           &lt;property name="hibernate.cache.use_second_level_cache" value="true" /&gt;
           --&gt;
           
           &lt;!-- # Pool de conexao com o banco de dados (C3PO) # --&gt;
           &lt;!--  
           &lt;property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /&gt;
           &lt;property name="hibernate.c3p0.acquire_increment"    value="1" /&gt;
           &lt;property name="hibernate.c3p0.idle_test_period"     value="100" /&gt;
           &lt;property name="hibernate.c3p0.min_size"             value="5" /&gt;
           &lt;property name="hibernate.c3p0.max_size"             value="60" /&gt;
           &lt;property name="hibernate.c3p0.max_statements"       value="150" /&gt;
           &lt;property name="hibernate.c3p0.timeout"              value="100" /&gt;
           --&gt;
        &lt;/properties&gt;
    &lt;/persistence-unit&gt;
&lt;/persistence&gt;
O que estou fazendo de errado ?

Obrigado.

2 Respostas

Lucas_Cavalcanti

vamos por partes:

  • vc não deve mais usar o JPACustomProvider… ao invés disso, registre o pacote do jpa:
<context-param>
		<param-name>br.com.caelum.vraptor.packages</param-name>
		<param-value>br.com.caelum.vraptor.util.jpa</param-value>
	</context-param>

não esqueça de tirar a declaração do JPACustomProvider

  • para receber o DAOFactory no construtor, vc precisa anotá-lo com @Component

  • se vc usa o JPA do VRaptor, vc não precisa do seu JPAFactory, basta receber EntityManager no construtor das classes que precisam.

  • com o VRaptor, vc não precisa do DAOFactory, basta anotar os daos com @Component e recebê-los
    nos construtores das classes que precisam usá-los. Ou seja, se vc precisa do UsuarioDAO, receba-o no construtor. A desvantagem é que vc não pode receber um GenericDAO no construtor a menos que vc tenha uma classe BolinhaDAO extends GenericDAO anotada com @Component.

se vc quer continuar com a JPAFactory, vc não deve colocar nem o JPACustomProvider nem a configuração que eu te passei.

Abraços

softwork

Lucas Cavalcanti:
vamos por partes:

  • vc não deve mais usar o JPACustomProvider… ao invés disso, registre o pacote do jpa:
<context-param>
		<param-name>br.com.caelum.vraptor.packages</param-name>
		<param-value>br.com.caelum.vraptor.util.jpa</param-value>
	</context-param>

não esqueça de tirar a declaração do JPACustomProvider

  • para receber o DAOFactory no construtor, vc precisa anotá-lo com @Component

  • se vc usa o JPA do VRaptor, vc não precisa do seu JPAFactory, basta receber EntityManager no construtor das classes que precisam.

  • com o VRaptor, vc não precisa do DAOFactory, basta anotar os daos com @Component e recebê-los
    nos construtores das classes que precisam usá-los. Ou seja, se vc precisa do UsuarioDAO, receba-o no construtor. A desvantagem é que vc não pode receber um GenericDAO no construtor a menos que vc tenha uma classe BolinhaDAO extends GenericDAO anotada com @Component.

se vc quer continuar com a JPAFactory, vc não deve colocar nem o JPACustomProvider nem a configuração que eu te passei.

Abraços

Novamente só tenho que lhe agradecer pela ajuda!

Funcionou direitinho…

Valeu…

Criado 1 de dezembro de 2010
Ultima resposta 1 de dez. de 2010
Respostas 2
Participantes 2