Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

Tentando configurar Spring com o JPA - Erro

Estou tentando fazer uma pequena aplicação, usando Spring e JPA. Fiz um teste com uma class MAIN fazendo insert no banco e deu certo, mas agora com o Spring não consigo.

Erro:

Error creating bean with name 'associadoController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: br.com.bolsauniversidade.dao.JpaAssociadoDao br.com.bolsauniversidade.controller.AssociadoController.dao; nested exception is java.lang.NoClassDefFoundError: javax/persistence/EntityManagerFactory

esse é meu controller:

@Component
public class AssociadoController {

    @Autowired
    JpaAssociadoDao dao;

    @RequestMapping("Cadastro-Associado")
    public String execute(){
        System.out.println("Executando");
        return "Cadastro-Associado";
    }
    @Transactional
    @RequestMapping("cadastra_associado")
    public String cadastro(Associado associado){
        dao.adiciona(associado);

        return "Cadastro-Associado";
    }

}

Essa é minha interface dao e a class:

public interface AssociadoDAO {
    Associado buscaPorId(Long id);
      List<Associado> lista();
      void adiciona(Associado associado);
      void altera(Associado associado);
      void remove(Associado associado);
      void finaliza(int cod);
}

-------------------------------------------------------------------

@Repository
public class JpaAssociadoDao implements AssociadoDAO{

  @PersistenceContext
 private EntityManager manager;

    public void adiciona(Associado associado) {
      manager.persist(associado);
    }

    public void altera(Associado associado) {
      manager.merge(associado);
    }
outros metodos...

Minha configuração do Spring eta assim:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc 
                        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
                        http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="br.com.bolsauniversidade" />
    <mvc:annotation-driven />
     <bean id="entityManagerFactory"

        class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">

        <property name="persistenceUnitName"

               value="persistenceUnit" />

        </bean>

<bean id="transactionManager"

        class="org.springframework.orm.jpa.JpaTransactionManager">

        <property name="entityManagerFactory"

               ref="entityManagerFactory" />

</bean>




<bean id="JpaAssociadoDao"

               class="br.com.bolsauniversiadde.dao.JpaAssociadoDao" />


    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>


</beans>

E meu persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

    <!-- unidade de persistencia com o nome financas -->
    <persistence-unit name="bolsauniversidade" transaction-type ="RESOURCE_LOCAL">

        <!-- Implementação do JPA, no nosso caso Hibernate -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <!-- Aqui são listadas todas as entidades -->
        <class>br.com.bolsauniversidade.modelo.Associado</class>
        <class>br.com.bolsauniversidade.modelo.AssociadoProfissional</class>
        <properties>

            <!-- Propriedades JDBC -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/bolsauniversidade" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="root" />

            <!-- Configurações específicas do Hibernate -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>
12 respostas

(Não é relativo ao exercício: O arquivo persistence.xml e o datasource configurado, acabei abrindo nesse curso kkkk)

Felipe, só uma pergunta. Esta correto essa anotacao no seu Controller? @Component, não deveria ser @Controller ?

Eu alterei para @Component porque vi uns exemplos .. mas é @Controller mesmo .. mas ainda da erro

Felipe tambem tava com mesmo problema pra fazer integração jpa com spring. Tentei buscar ate no proprio forum do spring mas não consegui seguir (inclusive ficou muito semelhante ae seu codigo). Fui encontrar resposta numa apostila da caelum (http://www.caelum.com.br/apostila-java-web/apendice-integracao-do-spring-com-jpa/) Criei um novo projeto aqui com teus arquivos e consegui rodar, fazendo algumas modificações:

spring-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="br.com.bolsauniversidade" />
    <mvc:annotation-driven />
    <mvc:default-servlet-handler/>

<!--     <bean id="entityManagerFactory" -->
<!--         class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> -->
<!--         <property name="persistenceUnitName" value="persistenceUnit" /> -->
<!--     </bean> -->
<!--     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> -->
<!--         <property name="entityManagerFactory" ref="entityManagerFactory" /> -->
<!--     </bean> -->

    <bean id="postgresDataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="org.postgresql.Driver"/>
        <property name="url" value="jdbc:postgresql:organizador"/>
        <property name="username" value="postgres"/>
        <property name="password" value="postgres"/>
    </bean>        

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="postgresDataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>

    <bean id="JpaAssociadoDao" class="br.com.bolsauniversidade.dao.JpaAssociadoDao" />
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <!-- unidade de persistencia com o nome financas -->
    <persistence-unit name="bolsauniversidade" 
        transaction-type="RESOURCE_LOCAL">
        <!-- Implementação do JPA, no nosso caso Hibernate -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- Aqui são listadas todas as entidades -->
        <class>br.com.bolsauniversidade.modelo.Associado</class>
<!--         <class>br.com.bolsauniversidade.modelo.AssociadoProfissional</class> -->
<!--         <properties> -->
            <!-- Propriedades JDBC -->
<!--             <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> -->
<!--             <property name="javax.persistence.jdbc.url" value="jdbc:postgresql:organizador" /> -->
<!--             <property name="javax.persistence.jdbc.user" value="postgres" /> -->
<!--             <property name="javax.persistence.jdbc.password" value="postgres" /> -->
            <!-- Configurações específicas do Hibernate -->
<!--             <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> -->
<!--             <property name="hibernate.hbm2ddl.auto" value="update" /> -->
<!--             <property name="hibernate.show_sql" value="true" /> -->
<!--             <property name="hibernate.format_sql" value="true" /> -->
<!--         </properties> -->

            <properties>
                <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
                <property name="hibernate.show_sql" value="true"/>
                <property name="hibernate.format_sql" value="true"/>
                <property name="hibernate.hbm2ddl.auto" value="update"/>
            </properties>

    </persistence-unit>
</persistence>

obs 1.: tem um erro de digitação no seu spring-context: em negrito

class="br.com.**bolsauniversiadde**.dao.JpaAssociadoDao" />

obs 2: tive que alterar as configurações para o banco postgres para rodar aqui na minha maquina.

Tenta fazer essas alterações para ver se roda. Boa sorte !

Falou um detalhe.... Comentar a linha no arquivo spring-context.xml:

<bean id="JpaAssociadoDao" class="br.com.bolsauniversidade.dao.JpaAssociadoDao" />

Obrigado pela ajuda, mas agora esta dando esse erro

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/spring-context.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: javax/persistence/PersistenceException

Olá Felipe, não quer postar aqui o teu spring-context.xml e persistence.xml ?

Felipe, pelo erro parece está falando lib. certifica que essas libs estão no seu projeto:

  • aopalliance.jar
    • spring-orm-4.x.x.RELEASE.jar
    • spring-tx-4.x.x.RELEASE.jar

esses jars estão no projeto sim .. meu spring-context.xml ficou assim

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="br.com.bolsauniversidade" />
    <mvc:annotation-driven />
    <mvc:default-servlet-handler/>
    <bean id="mysqlDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/bolsauniversidade"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="mysqlDataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>
    <!--  <bean id="JpaAssociadoDao" class="br.com.bolsauniversidade.dao.JpaAssociadoDao" />-->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <mvc:annotation-driven/>    
<tx:annotation-driven />
<context:annotation-config />

</beans>

e o persistence.xml assim:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

    <!-- unidade de persistencia com o nome financas -->
    <persistence-unit name="bolsauniversidade" transaction-type ="RESOURCE_LOCAL">

        <!-- Implementação do JPA, no nosso caso Hibernate -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <!-- Aqui são listadas todas as entidades -->
        <class>br.com.bolsauniversidade.modelo.Associado</class>
        <class>br.com.bolsauniversidade.modelo.AssociadoProfissional</class>
        <properties>

            <!-- Propriedades JDBC -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/bolsauniversidade" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="root" />

            <!-- Configurações específicas do Hibernate -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

Felipe, encontrei uma diferença no seu arquivo spring.

 <bean id="mysqlDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/bolsauniversidade"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>

tenta substituir a class para: org.apache.commons.dbcp.BasicDataSource

 <bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/bolsauniversidade"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>

Oi Felipe! Tudo bem?

Você conseguiu resolver o problema?

Dê uma olhadinha se as dependências da JPA estão no seu Classpath.

Abraços!

solução!

Esqueci de responder aqui, consegui fazer. Peguei um projeto como base e fui alterando ! O problema estava nas configurações do entityManagerFactory eu acho.

Obrigado pela ajuda ai pessoal.