1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Erro na configuração da JPA com spring, problema no @Autowired

Tenho um projeto spring que estou tentando configurar JPA agora, seguindo esse guia, https://spring.io/guides/gs/accessing-data-jpa/

ao fazer algo semelhante no meu projeto, a principal diferença imagino que seja porque estou tentando usar o @Autowired em um controller, estou tomando um erro.

está assim:

package br.com.projeto.dao;

import org.springframework.data.repository.CrudRepository;
import br.com.projeto.model.Notificacao;

public interface NotificacaoRepository extends CrudRepository<Notificacao, Long> {

}

no meu controler tenho a declaração do autowired

@Controller
public class NotificacaoController {
    private static final Logger logger = LogManager.getLogger( "LOGFILE" );

    @Autowired
    NotificacaoRepository repo;

apenas essa declaração da variável já faz dar erro na inicialização do servidor

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'notificacaoController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: br.com.projeto.dao.NotificacaoRepository br.com.projeto.controller.NotificacaoController.repo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.projeto.dao.NotificacaoRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Toda a inicialização do projeto foi com anotações, não usei XML. Até colocar essa anotação do @Autowired, eu tinha um projeto que subia e recebia requisições nesse controller

o meu setPackagesToScan está configurado para br.com.projeto, abaixo está o meu WebAppConfig completo


@Configuration
@ComponentScan({"br.com.projeto"})
@EnableWebMvc
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
public class WebAppConfig {

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));

        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource( dataSource() );
        em.setPackagesToScan( new String[] { "br.com.projeto.model" } ); // package do meu model, Notificacao.java

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter( vendorAdapter );
        em.setJpaProperties( additionalProperties() );

        return em;
    }

    @Bean
    public PlatformTransactionManager transactionManager( EntityManagerFactory emf ) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory( emf );

        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty( "hibernate.hbm2ddl.auto", "create-drop" );
        properties.setProperty( "hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect" );
        return properties;
    }    

    @Bean
    public UrlBasedViewResolver setupViewResolver() {
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/WEB-INF/pages/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

}

UPDATE


isso poderia ser versão dos jars? Porque o meu pom.xml foi uma cópia de um exemplo que achei, aí ele tinha o spring na versão 3.2.2, colei o pedaço dele abaixo

Aí lendo sobre JPA eu vi um exemplo usando o CrudRepository, e achei bem legal, aí eu adicionei esse "spring-data-commons" na versão 1.9.2 pois na configuração que eu tinha do pom não existia esse CrudRepository

    <properties>
        <spring.version>3.2.2.RELEASE</spring.version>
    </properties>
    ...
        <!-- SPRING -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>



        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
            <version>1.9.2.RELEASE</version>
        </dependency>

SOLUÇÃO - POM.XML


    <properties>
        <mysql.connector.version>5.1.21</mysql.connector.version>
        <spring.version>3.2.13.RELEASE</spring.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>

            <!--spring-data-commons não precisa pq já vem como dependencia do spring-data-jpa 1.6.5-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.6.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.2.0.Final</version>
        </dependency>        
            <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.connector.version}</version>
            </dependency>


        <!-- CGLIB is required to process @Configuration classes -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- Servlet API and JSTL -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
  • Coloca o NotificacaoRepository repo como "private" em NotificacaoController. Colocou os gets/sets no controller?? Sem eles não faz injeção. Sua classe NotificacaoRepository tem todos os gets/sets necessários?

    Thomas Teixeira   30 de mar de 2015
  • não mudou nada do erro

    danielbchaves   01 de abr de 2015
  • Mude isto: @ComponentScan({"br.com.projeto"}) para: @ComponentScan({"br.com.projeto.*"})

    LeonanLuppi   01 de abr de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags java web spring ou faça a sua própria pergunta.