【问题标题】:Spring data repository not found at compile time编译时未找到 Spring 数据存储库
【发布时间】:2018-06-05 12:25:03
【问题描述】:

我正在尝试在 Spring Boot 应用程序中使用 Spring 数据和存储库,但在编译项目时出现错误。

这是我的实体:

package fr.investstore.model;

import javax.persistence.Id;
...

@Entity
public class CrowdOperation {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long id;

    @Enumerated(EnumType.STRING)
    public RepaymentType repaymentType;

    ...
}

以及对应的Repository:

package fr.investstore.repositories;

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

import fr.investstore.model.CrowdOperation;


public interface CrowdOperationRepository extends CrudRepository<CrowdOperation, Long> {

}

我在一个WS控制器中使用它,通过Autowired注解生成一个仓库:

package fr.investstore.ws;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
...

@Controller
@EnableAutoConfiguration
public class SampleController {

    @Autowired
    private CrowdOperationRepository crowdOperationRepository;


    @RequestMapping(path = "/", method = RequestMethod.GET)
    @ResponseBody
    public String getOperations(@RequestParam(required=true, defaultValue="Stranger") String name) {
        crowdOperationRepository.save(new CrowdOperation());
        return "Hello " + name;
    }
}

以及应用程序的代码:

package fr.investstore;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import fr.investstore.ws.SampleController;

@SpringBootApplication
public class InvestStoreApplication {

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

但是在编译项目时我得到:


应用程序启动失败


描述:字段 crowdOperationRepository 在 fr.investstore.ws.SampleController 需要一个 bean 类型 'fr.investstore.repositories.CrowdOperationRepository' 不能 找到了。

操作:考虑定义一个 bean 类型 'fr.investstore.repositories.CrowdOperationRepository' 在您的 配置。

Spring不会通过接口自动为repository生成一个bean吗? 我该如何解决这个问题?

编辑:我还尝试将Repository 注释(来自org.springframework.stereotype.Repository)放到CrowdOperationRepository 上,但我得到了同样的错误

【问题讨论】:

  • 1.这是运行时错误,而不是编译错误。 2. 发布您的 Application 类的代码,包括包声明。
  • @JBNizet 我已经更新了帖子来放 App 类的代码
  • SpringApplication.run(SampleController.class, args); 替换为SpringApplication.run(InvestStoreApplication.class, args);。并删除控制器上无用的@EnableAutoConfiguration
  • 你需要同时做这两件事,Ravat Tailor 和 SeverityOne 在那里写的答案!
  • @JBNizet 你能添加一个答案吗?我会接受它,因为它工作得很好:)

标签: spring hibernate repository spring-data-jpa spring-repositories


【解决方案1】:

在创建 spring-boot 应用程序时,我们需要记住一些要点,例如

  1. 始终将主类(带有`@SpringBootApplication 注解的类)保留在*包中,其他类应位于子包下。

  2. 始终使用适当的注释标记您的 bean 类,例如所有repositories都用@Repository注解,所有服务实现类用@Service标记,其他组件类用@Component标记,定义我们bean的类用@Configuration标记

  3. 启用您正在使用的功能,例如@EnableJpaRepositories@EnableTransactionManagement@EnableJpaAuditing,这些注解还提供了让我们定义spring需要扫描哪个包的功能。

因此,在您的情况下,您需要使用 @EnableJpaRepositories 注释标记 InvestStoreApplication 类,并使用 @Repository 标记 CrowdOperationRepository

【讨论】:

  • 我将 @EnableJpaRepositories 添加到 jhipster 项目的 Application 主类中,它再次神奇地工作了:v
【解决方案2】:

您必须告诉您的 Spring Boot 应用程序加载 JPA 存储库。

将此复制到您的应用程序类

它会自动扫描您的 JPA 存储库并将其加载到您的 Spring 容器中,即使您没有使用 @Repository 定义您的接口,它也会将该 bean 连接到您的依赖类中。

@EnableJpaRepositories(basePackages = { "fr.investstore.repositories" })

【讨论】:

    【解决方案3】:

    感谢@JBNizet 的评论,这让它发挥了作用。

    我创建了这个答案,因为他没有:

    替换 SpringApplication.run(SampleController.class, args);使用 SpringApplication.run(InvestStoreApplication.class,args);。并删除控制器上无用的@EnableAutoConfiguration。

    【讨论】: