存储库注释不适用于 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的主要内容,如果未能解决你的问题,请参考以下文章

通过注释的 Spring 授权不适用于自定义身份验证

JSF 注释不适用于 Spring-boot

使用 DirtiesContext 注释重新加载 Spring 应用程序不适用于嵌套类

Spring Data JPA 审计不适用于带有 @Modifying 注释的 JpaRepository 更新方法,为啥?

Spring Jaxb2RootElementHttpMessageConverter 不适用于 jaxb 注释

Spring数据mongodb存储库语法中的@Query注释