Spring Data JPA中的存储库注释不起作用

3
我正在构建一个Spring-boot应用程序,其中我使用了Spring data jpa功能。
请查看下面的dao层代码。
package com.adv.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CustomerDao extends JpaRepository<Customer, String> {

}

我将使用DaoProvider类,如下所示:

package com.adv.dao;

import java.io.Serializable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class DaoProvider implements Serializable {

private static final long serialVersionUID = 1L; 

@Autowired
private CustomerDao customerDao;

public CustomerDao getCustomerDao() {
    return customerDao;
}
}

我的Spring Boot主类定义如下:

@SpringBootApplication
@ComponentScan(basePackages="com.adv")
public class AdvMain extends SpringBootServletInitializer {

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
      return application.sources(AdvMain.class);
   }

    public static void main(String[] args) {
       SpringApplication.run(AdvMain.class, args);
    }
 }

现在运行时我遇到了以下异常:

Field customerDao in com.adv.dao.DaoProvider required a bean of type 'com.adv.dao.CustomerDao' that could not be found.

我猜测在接口 CustomerDao 上的注解 @Repository 无法起作用。

但是我无法找出问题所在。有人能够找出问题吗?


2
尝试按照 Can't Autowire @Repository annotated interface in Spring Boot 上的建议,在 AdvMain 上添加 @EnableJpaRepositories("com.adv.dao") - Al-Mustafa Azhari
好的,谢谢。在添加@EnableJpaRepositories("com.adv.dao")之后它可以工作了。 - Sumit Ghosh
3个回答

8

1
从dao接口中删除@Repository注释。该注释只能放在实现类上。
还要注意实现Customer类的空构造函数和全参构造函数。

在使用JpaRepository时,我们需要在接口级别添加Repository注释。这与其他普通接口略有不同。您指出的内容适用于所有其他用户定义的接口。 - Sumit Ghosh
1
我通常在没有注释@ Repository的情况下使用,它可以完美地工作。我知道这不是常规接口,但实际的bean是由Spring实现的,因此Spring知道它是一个repo bean。 - Alessandro Argentieri

0
只需彻底删除 @ComponentScan 注释。 @SpringBootApplication 注释已包含指定的组件扫描 here

ComponentScan是必需的,因为我对各种类进行了包分离。默认情况下,Spring仅扫描主类所在的包。无论如何,解决我的问题的答案是使用EnableJpaRepositories。 - Sumit Ghosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接