【问题标题】:Could not autowire. No beans of 'NoteRepository' type found无法自动接线。找不到“NoteRepository”类型的 bean
【发布时间】:2018-02-05 05:29:06
【问题描述】:

我的控制器类在下面。

@Controller
public class app {

    @GetMapping(path = "/")
    public @ResponseBody
    String hello() {
        return "Hello app";
    }
}

当我浏览网址时,它工作正常。但是当添加下面的代码时,它会显示"Could not autowire. No beans of 'NoteRepository' type found"

@Autowired
    NoteRepository noteRepository;

    // Create a new Note
    @PostMapping("/notes")
    public Note createNote(@Valid @RequestBody Note note) {
        return noteRepository.save(note);
    }

应用程序控制器类位于主类(运行应用程序)所在的同一个包中。但是当我们将上述代码添加到不同包中的控制器时,它不会显示错误。但是当我们通过 url 导航时,即使是一个简单的 get 方法也不起作用。

我的主要课程如下。

@SpringBootApplication
@EnableJpaAuditing
public class CrudApplication {

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

我的存储库类是

@Repository
public interface NoteRepository extends JpaRepository<Note, Long> {
}

我的项目结构

我想找到解决方案:

  1. 注入NoteRepository 的实例。我总是收到消息“无法自动装配。找不到类型的 bean”错误。 Spring不能注入,不管接口在同一个包还是不同包。

  2. 我无法在控制器 (MyController) 中运行与应用程序入口点不同的包中的方法。

【问题讨论】:

  • 完成。检查更新的。
  • 您的代码看起来不错。 repo 类可能没有被组件扫描。
  • 尝试将@EnableJpaRepositories 添加到您的配置类
  • 将您的CrudApplication 移动到com.demo 而不是子包,这样它将扫描所有包并自动检测存储库和实体。
  • @M.Deinum 你是对的。我应该在 CRUD(main) 包中创建模型、控制器包。

标签: java spring spring-boot


【解决方案1】:

主要症状是这样的:

应用程序控制器类与主类(运行应用程序)在同一个包中。但是当我们将上面的代码添加到不同包中的控制器时,它不会显示错误。但是当我们通过 url 导航时,即使是一个简单的 get 方法也不起作用。

默认情况下,Spring Boot 应用程序只会自动发现在与主类相同的包中声明的 bean。对于不同包中的 bean,您需要指定包含它们。您可以为此使用@ComponentScan

package foo.bar.main;

//import statements....

//this annotation will tell Spring to search for bean definitions
//in "foo.bar" package and subpackages.
@ComponentScan(basePackages = {"foo.bar"})
@SpringBootApplication
@EnableJpaAuditing
public class CrudApplication {

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



package foo.bar.controller;

//import statements....

//since @ComponentScan, now this bean will be discovered
@Controller
public class app {

    @GetMapping(path = "/")
    public @ResponseBody
    String hello() {
        return "Hello app";
    }
}

为了让 Spring Data 识别应该创建哪些存储库,您应该在主类中添加 @EnableJpaRepositories 注释。此外,为了让 Spring Data 和 JPA 实现扫描实体,请添加 @EntityScan

@ComponentScan(basePackages = {"foo.bar"})
@SpringBootApplication
@EnableJpaAuditing
@EnableJpaRepositories("your.repository.packagename")
@EntityScan("your.domain.packagename")
public class CrudApplication {
    //code...
}

【讨论】:

  • 您在这里提到的两个类都在同一个包中,当我们通过 url 导航时,它会显示“Hello app”。当我尝试添加位于另一个名为存储库的包中的存储库类实例时,问题就开始了。
  • 您提到如果您将控制器移动到不同的包中,那么在点击 url 时将无法获得结果。这意味着没有创建控制器的 bean。考虑到这一点,您需要告诉 Spring 在哪里可以找到 bean。 Spring 没有任何魔法。
  • 当我移动到不同的包时它不会起作用,但不会显示错误“无法自动装配”。当它显示在同一个包中时。检查项目结构。
  • 那是因为 Spring 没有尝试创建该类的 bean。我建议你复习一下 Spring 的基础知识。
  • 不同包中的存储库类但是当我尝试@ComponentScan时它不适用于笔记存储库实例。
【解决方案2】:

你应该为 spring 添加包来扫描它们

@SpringBootApplication(scanBasePackages={"package1", "package2"})

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 2019-08-17
    • 2021-07-02
    • 2020-08-31
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多