存储库注释不适用于 Spring 数据 JPA
Posted
技术标签:
【中文标题】存储库注释不适用于 Spring 数据 JPA【英文标题】:Repository annotation is not working on Spring data JPA 【发布时间】:2018-08-27 00:56:30 【问题描述】:我正在构建一个使用 Spring data jpa 功能的 Spring-boot 应用程序。
请在下面找到我的 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
注释不起作用。
但我无法找出问题所在。谁能找出问题所在?
【问题讨论】:
尝试按照Can't Autowire @Repository annotated interface in Spring Boot的建议在AdvMain
上添加@EnableJpaRepositories("com.adv.dao")
ok.thanks. 添加@EnableJpaRepositories("com.adv.dao") 后它工作了
【参考方案1】:
从 dao 接口中移除注解 @Repository。该注释只能放在已实现的类上。
还要小心实现空构造函数而不是 Customer 类的所有 args 构造函数。
【讨论】:
否 Alex。我们在使用 JpaRepository 时需要在接口级别使用此 Repository 注释。它与其他普通接口几乎没有什么不同。您指出的任何内容都适用于所有其他用户定义接口。 我总是使用不带注释的@Repository,它工作得很好。我知道这不是一个普通的接口,真正的bean仍然是由Spring实现的,所以Spring知道它是一个repo bean。【参考方案2】:只需完全删除@ComponentScan
注释。@SpringBootApplication
注释已经包含指定here 的组件扫描。
【讨论】:
ComponentScan 是必需的,因为我对各种类进行了包隔离。默认情况下,spring 只扫描主类所在的包。无论如何,我的问题的答案是使用 EnableJpaRepositories。【参考方案3】:按照@hang321 在Can't Autowire @Repository annotated interface in Spring Boot
Ask 上的建议,尝试在AdvMain
上添加@EnableJpaRepositories("com.adv.dao")
【讨论】:
以上是关于存储库注释不适用于 Spring 数据 JPA的主要内容,如果未能解决你的问题,请参考以下文章
使用 DirtiesContext 注释重新加载 Spring 应用程序不适用于嵌套类
Spring Data JPA 审计不适用于带有 @Modifying 注释的 JpaRepository 更新方法,为啥?