我从学习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<Person> persons(){
return this.personRepository.findAll();
}
}
当所有内容都在com.person
包中时,我会在网络浏览器http://localhost:8080/persons中写一下它能正常工作......
但我希望将PersonController.java
移至com.controller
包,当我移动它时,我的网页浏览器会给我打电话
出现意外错误(type = Not Found,status = 404)。没有消息 可用
我不知道应该怎么做才能修复它。也许我应该在我的pom.xml
??
我的pom.xml看起来像
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.person</groupId>
<artifactId>person</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringTest_v0_1</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0.BUILD-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.h2database</groupId><artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>
spring-boot-starter-data-elasticsearch
</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
它是自动生成的,我只写一个依赖
<dependency>
<groupId>com.h2database</groupId><artifactId>h2</artifactId>
</dependency>
答案 0 :(得分:57)
使用basePackages:
@ComponentScan(basePackages = { "com.person","com.controller"} )
答案 1 :(得分:6)
我遇到了同样的问题,这里提供的答案对我有用,但我不得不添加另一个弹簧注释,并且在处理大量存储库时更为通用。 我们有以下结构:
|-src/main/java
|--com.person
|--repositories
|--controllers
|--...
然后应该在主
中添加@SpringBootApplication(scanBasePackages = {"com.person"})
@EnableMongoRepositories(basePackages = "com.person.repositories")
public class MainDemoApplication { //
}
答案 2 :(得分:4)
使用@SpringBootApplication
注释相当于使用@Configuration
,@EnableAutoConfiguration
和@ComponentScan
。
来自文档:
ComponentScan配置组件扫描指令以供使用 @Configuration类。提供与Spring XML并行的支持 元件。
basePackageClasses(),basePackages()或其别名值()之一可以 指定用于定义要扫描的特定包。如果具体包装 未定义扫描将从类的包中发生 这个注释。
您可以像往常一样移动它,也可以在basePackages
中指定@ComponentScan
。
答案 3 :(得分:2)
我们可以使用@ComponentScan (basePackages = {"include your package name here"})
。
此外,如果您有一些常见的包命名格式,那么我们可以只使用*
等@ComponentScan(basePackages = { "com.*"}
包含包名称的公共部分,以便扫描具有该公共包名称的所有包。 / p>
答案 4 :(得分:2)
假定主要方法位于com.setech.app包中,而控制器位于com.setech.controller包中。
对于spring-boot 1.3.x或更高版本,请尝试添加“ scanBasePackages”。
@SpringBootApplication(scanBasePackages = { "com.setech"} )
public class ResttanslatorApplication {
public static void main(String[] args) {
SpringApplication.run(ResttanslatorApplication.class, args);
}
}
信贷从here发给卡米尔·沃兹尼亚克。
答案 5 :(得分:2)
对于Maven案例:如果将控制器放在另一个不同的子模块(与主类不同)中,则应在pom.xml中添加依赖项。
答案 6 :(得分:2)
将Springbootapplication(application.java)文件移动到另一个软件包为我解决了这个问题。将其与控制器和存储库分开。您可以使用任意数量的软件包并具有多个控制器。但是请使用Consider defining a bean of type..
并提及所有软件包。
此外,您可能会遇到此问题,{{1}}单击here!
答案 7 :(得分:1)
我有同样的问题,但突然发现我的Application.java类(带有main方法和@SpringBootApplication注释的类)位于不同但并行的包中,带有@Controller类。
问题是Application.java类应该在所有其他包中相同或最重要,然后我们不需要任何@ComponentScan,并且将自动扫描所有bean。例如:如果Application.java位于com.person中,而所有应用程序bean都位于com.person中,那么它将在没有@ComponentScan的情况下工作。
答案 8 :(得分:0)
作为一直在努力解决此问题的人,如果您发现提供的解决方案无效。
请检查是否直接将源文件放在根目录下,例如,
src\main\java\xxx.java
它对投影有负面影响,但我不知道根本原因。反正
请至少将源文件放入一个自己创建的包中,例如:
src\main\java\pack1\xxx.java
重试其他设置。它确实解决了我的问题。
答案 9 :(得分:0)
您只需在 @ComponentScan 中定义程序包名称 像:
@SpringBootApplication
@ComponentScan({"com.project.pck_name"})
public class MainClassHome {
public static void main(String[] args) {
SpringApplication.run(MainClassHome.class, args);
}
}
然后更新项目:-右键单击您的项目-> maven->更新项目
答案 10 :(得分:0)
我们可以使用@Import而不是使用ComponentsScan。
@Configuration
@Import({PersonController.class})
public class MainClassHome {
public static void main(String[] args) {
SpringApplication.run(MainClassHome.class, args);
}
}