【问题标题】:@Autowired can't find Repository bean@Autowired 找不到存储库 bean
【发布时间】:2017-03-07 23:58:15
【问题描述】:

我有一个 Crud Repository 界面

@Repository
public interface SampleRepository extends CrudRepository<Metadata, String> {
     findById(UUID id);
}

I am trying to use it in my test class which is in another package
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestConfig.class})
@WebAppConfiguration
public class SampleRepositoryTest {

    @Autowired
    private SampleRepository sampleRepository;

它说没有找到带有 SampleRepository 的 bean 定义。谁能帮助我为什么我不能自动装配这个存储库

【问题讨论】:

  • 您的 TestConfig 类是否启用 Spring Data JPA 并执行 repo 扫描?
  • 有点需要看那个配置。 (而@Repository 完全没有必要。)
  • 我该怎么做?
  • 必须有一些地方可以使用@ComponentScan 注解。 @ComponentScan(basePackages = "xxx.xxx.xxx")

标签: java spring spring-data-jpa


【解决方案1】:

如 cmets 中所述:您的 SampleRepository 不需要 @Repository。 测试中的@WebAppConfiguration 看起来也很奇怪。但是这两个都可以。

更重要的是:即使没有提供您的 TestContext.java 文件,它也应该是这样的:

@Configuration
// be sure to provide base package where your repostories are located
@EnableJpaRepositories(basePackages = {
    "com.acme.repositories"
})
public class TestContext {
  // your datasource
  @Bean
  public DataSource dataSource() {
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    return builder.setType(EmbeddedDatabaseType.HSQL).build();
  }

  // your entity manager factory
  @Bean
  public EntityManagerFactory entityManagerFactory() {

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

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(vendorAdapter);
    // your domain classes package
    factory.setPackagesToScan("com.acme.domain");
    factory.setDataSource(dataSource());
    factory.afterPropertiesSet();

    return factory.getObject();
  }

  // your jpa transaction manager
  @Bean
  public PlatformTransactionManager transactionManager() {
    JpaTransactionManager txManager = new JpaTransactionManager();
    txManager.setEntityManagerFactory(entityManagerFactory());
    return txManager;
  }
}

【讨论】:

  • 我遇到了类似的 jpa 存储库没有自动装配的问题。我可以说非其他对我有用,除了这个。 EnableJpaRepositories 是关键。非常感谢。
【解决方案2】:

@Repository 不是必需的。你的代码应该是这样的:

public interface SampleRepository extends CrudRepository<Metadata, String> {
 @Query(value = "select * from db.tabel where id = :id", nativeQuery = true)
 findById(@Param("id") UUID id);
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 2019-08-27
    • 2020-11-21
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多