java - 无法引用 PersonsRepository 接口(interface)的实例

标签 java spring hibernate

我正在使用 Spring 数据教程:http://spring.io/guides/tutorials/data/3/

我正在尝试启动并运行我的 Spring 4 + Hibernate 应用程序。我根据指南创建了以下单元测试:

/**
 * 
 */
package com.corrisoft.air.db.integration;

import static org.junit.Assert.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;

import com.corrisoft.air.db.JPAConfiguration;
import com.corrisoft.air.db.repository.PersonsRepository;
import com.corrisoft.air.model.Person;

    /**
     * @author Corrisoft Android Development
     *
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {JPAConfiguration.class})
    @Transactional
    @TransactionConfiguration(defaultRollback = true)
    public class PersonsRepositoryIntegerationTests {

          @Autowired
          PersonsRepository personsRepository;

          @Test
          public void thatItemIsInsertedIntoRepoWorks() throws Exception {
            int id = 42;

            Person person = new Person();
            person.setId(id);

            person.setFirstName("Zaphod");
            person.setLastName("Beeblebrox");

            personsRepository.save(person);

            Person retrievedPerson = personsRepository.findById(id);

            assertNotNull(retrievedPerson);
            assertEquals(id, retrievedPerson.getId());
          }
    }

This tests the repository that I've created here:

    /**
     * 
     */
    package com.corrisoft.air.db.repository;

    import com.corrisoft.air.model.Person;
    import org.springframework.data.repository.CrudRepository;

    /**
     * @author Corrisoft Android Development
     *
     */
    public interface PersonsRepository extends CrudRepository<Person, Integer>{
        Person findById(long id);
    }

我遇到以下异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.corrisoft.air.db.repository.PersonsRepository] 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)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
    ... 28 more

文档说,如果我有这样的 JPAConfuration 类,将从接口(interface)创建代理对象:

/**
 * 
 */
package com.corrisoft.air.db;

import java.sql.SQLException;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.orm.hibernate4.HibernateExceptionTranslator;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.corrisoft.air.db.repository.PersonsRepository;

/**
 * @author Corrisoft Android Development
 * 
 */
@Configuration
@EnableJpaRepositories(basePackages = "com.corrisoft.db.repository",
                       includeFilters = @ComponentScan.Filter(value = { PersonsRepository.class }, type = FilterType.ASSIGNABLE_TYPE))
@EnableTransactionManagement
public class JPAConfiguration {

    @Bean
    public DataSource dataSource() throws SQLException {
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        return builder.setType(EmbeddedDatabaseType.H2).build();
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() throws SQLException {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.corrisoft.air.model");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();

        return factory.getObject();
    }

    @Bean
    public EntityManager entityManager(EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory.createEntityManager();
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws SQLException {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }

    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }
}

我已经发现了本教程的几个问题,并且我认为这是另一个问题。

最佳答案

您正在扫描错误的软件包以查找存储库:

... basePackages = "com.corrisoft.db.repository" ...

正确的是

import com.corrisoft.air.db.repository.PersonsRepository;

关于java - 无法引用 PersonsRepository 接口(interface)的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307511/

相关文章:

Java:使用自签名证书的 SSL 客户端身份验证

java - 如何使 HTML 表格滚动

java.io.FileNotFoundException : what's the meaning of information in console?

java - 无法通过 BufferedReader 读取文本文件

java - Spring 注入(inject)中的循环依赖 - 这是糟糕的设计吗?

java - 如何验证非必需的 RequestParam 不为空?

java - 扩展 `JpaRepository` ,但仅实现子接口(interface)

java - Hibernate org.hibernate.MappingException : Could not determine type for: java. util.Set 中的复合键错误,

java - 在 Web 应用程序中初始化 spring 和 hibernate

java - Jackson:名称为 'defaultReference' 的多个反向引用属性