其他包中的@RestController不起作用

我开始学习Spring,然后创建基本项目,创建数据库,插入值,然后在Web浏览器中打印它。 我的问题是,当我将RestController放在像主类一样的包中时 – 它可以,但我想将它分发给其他包,当我创建新包时,移动RestController它不起作用。 让我们解释一下:

我的项目看起来像:

|-Springtestv_01 |-src/main/java |--com.person <-- it's a main package |-Main.java |-Person.java |-PersonLineRunner.java |-PersonRepository.java |-PersonController.java |-com.controller <-- second package, I want put here PersonController.java |-src/main/resources |-data.sql pom.xml 

我的控制器看:

 @RestController public class PersonController { @Autowired PersonRepository personRepository; @RequestMapping("/persons") Collection persons(){ return this.personRepository.findAll(); } } 

当所有内容都在com.person包中时,我在web浏览器中写道http:// localhost:8080 /个人并且它正常工作……但我想将PersonController.java移动到com.controller包,当我移动它时,我的webbrowers打电话给我

出现意外错误(type = Not Found,status = 404)。 没有消息可用

我不知道应该怎么做才能修复它。 也许我应该在我的pom.xml改变一些东西?

我的pom.xml看起来像

   4.0.0 com.person person 0.0.1-SNAPSHOT jar SpringTest_v0_1 Demo project for Spring Boot  org.springframework.boot spring-boot-starter-parent 1.3.0.BUILD-SNAPSHOT     UTF-8 1.8    com.h2databaseh2   org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-test test   org.springframework.boot spring-boot-starter-data-jpa   org.springframework.boot  spring-boot-starter-data-elasticsearch       org.springframework.boot spring-boot-maven-plugin      spring-snapshots Spring Snapshots https://repo.spring.io/snapshot  true    spring-milestones Spring Milestones https://repo.spring.io/milestone  false      spring-snapshots Spring Snapshots https://repo.spring.io/snapshot  true    spring-milestones Spring Milestones https://repo.spring.io/milestone  false     

它是自动生成的,我只写一个依赖项

   com.h2databaseh2  

使用basePackages:

 @ComponentScan(basePackages = { "com.person","com.controller"} ) 

我有同样的问题,这里提供的答案为我工作,但我不得不添加另一个弹簧注释,它更通用,以处理大量的存储库。 我们有以下结构:

  |-src/main/java |--com.person |--repositories |--controllers |--... 

然后应该在主要部分添加

 @SpringBootApplication(scanBasePackages = {"com.person"}) @EnableMongoRepositories(basePackages = "com.person.repositories") public class MainDemoApplication { // } 

使用@SpringBootApplication注释等同于使用@Configuration @EnableAutoConfiguration@ComponentScan @EnableAutoConfiguration@ComponentScan

从文档:

ComponentScan配置组件扫描指令以与@Configuration类一起使用。 提供与Spring XML元素并行的支持。

可以指定basePackageClasses(),basePackages()或其别名值()之一来定义要扫描的特定包。 如果未定义特定包,则将使用此批注从类的包中进行扫描。

您可以像basePackages一样移动它,也可以在@ComponentScan指定basePackages

我们可以使用@ComponentScan (basePackages = {"include your package name here"})

此外,如果您有一些常见的包命名格式,那么我们可以只使用@ComponentScan(basePackages = { "com.*"}来包含包名称的公共部分,以便扫描具有该公共包名称的所有包。

我遇到了同样的问题,但突然发现我的Application.java类(带有main方法和@SpringBootApplication注释的类)与@Controller类位于不同但并行的包中。

问题是Application.java类应该在所有其他包中或者在其他包之上,然后我们不需要任何@ComponentScan,并且将自动扫描所有bean。 例如:如果Application.java位于com.person中,而所有应用程序bean都位于com.person中,那么它将在没有@ComponentScan的情况下工作。

作为一个努力解决这个问题的人,如果你发现提供的解决方案不起作用。
请检查是否直接将源文件放在根级别,例如
src\main\java\xxx.java

它对项目有负面影响,但我不知道根本原因。 无论如何,

请将源文件放在至少一个自创的包中,例如: src\main\java\pack1\xxx.java

再次尝试其他设置。 它确实解决了我的问题。