无法自动装配。没有'NoteRepository'的豆子找到的类型

时间:2018-02-05 05:29:06

标签: java spring spring-boot

我的控制器课程如下。

@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);
    }

App控制器类位于 同一个包 中,其中主类(运行应用程序)是。但是当我们将上面的代码添加到不同包中的控制器时,不会显示错误。但是当我们通过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> {
}

我的项目结构

Image 1

我想找到解决方案:

  1. 注入NoteRepository的实例。我总是得到消息&#34;无法自动装配。没有找到类型的豆类#34;错误。 Spring不能注入它,如果界面在相同或不同的包中并不重要。

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

  3. enter image description here

2 个答案:

答案 0 :(得分:6)

主要症状是:

  

App控制器类与主类(运行应用程序)所在的包相同。但是当我们将上面的代码添加到不同包中的控制器时,它不会显示错误。但是当我们通过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...
}

答案 1 :(得分:0)

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

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