我的控制器课程如下。
@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> {
}
我的项目结构
我想找到解决方案:
答案 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"})