其他包中的@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
再次尝试其他设置。 它确实解决了我的问题。