问题
I start with learning Spring and I create basic project which creates database, insert values and next print it in web browser. My problem is that when I have RestController in the same package like main class - its OK, but I want distribute it to other package and when I create new package, move the RestController it doesn't work. Let met explain:
My project looks like:
|-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
My controller looks:
@RestController
public class PersonController {
@Autowired PersonRepository personRepository;
@RequestMapping("/persons")
Collection<Person> persons(){
return this.personRepository.findAll();
}
}
When everything is in com.person
package, I write in web brower http://localhost:8080/persons and it works correctly...
But I Want move PersonController.java
to com.controller
package, and when I moved it, my webbrowers calls me
There was an unexpected error (type=Not Found, status=404). No message available
and I have no idea what I should do to repair it. Maybe I should change something in my pom.xml
??
My pom.xml looks like
<?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>
It is generated automatically, I write only one dependency
<dependency>
<groupId>com.h2database</groupId><artifactId>h2</artifactId>
</dependency>
回答1:
Use basePackages:
@ComponentScan(basePackages = { "com.person","com.controller"} )
回答2:
I had the same problem the answers provided here worked for me but i had to add another spring annotation and it's more general in case dealing with a lot of repositories. We have the following structure :
|-src/main/java
|--com.person
|--repositories
|--controllers
|--...
This then should be added in th main
@SpringBootApplication(scanBasePackages = {"com.person"})
@EnableMongoRepositories(basePackages = "com.person.repositories")
public class MainDemoApplication { //
}
回答3:
Using a @SpringBootApplication
annotation is equivalent to using @Configuration
, @EnableAutoConfiguration
and @ComponentScan
.
From the documentation:
ComponentScan configures component scanning directives for use with @Configuration classes. Provides support parallel with Spring XML's element.
One of basePackageClasses(), basePackages() or its alias value() may be specified to define specific packages to scan. If specific packages are not defined scanning will occur from the package of the class with this annotation.
You can either move it as you did or specify basePackages
in @ComponentScan
.
回答4:
We can use @ComponentScan (basePackages = {"include your package name here"})
.
Also if you have some common package naming format, then we can include just common part of package name with *
like @ComponentScan(basePackages = { "com.*"}
, so that all packages having that common package name will get scanned.
回答5:
Assuming the main method is in the package called com.setech.app and a controller is in a package called com.setech.controller.
For spring-boot 1.3.x upwards try this by adding "scanBasePackages" like this.
@SpringBootApplication(scanBasePackages = { "com.setech"} )
public class ResttanslatorApplication {
public static void main(String[] args) {
SpringApplication.run(ResttanslatorApplication.class, args);
}
}
Credit goes to Kamil Wozniak from here.
回答6:
I had the same problem but suddenly found that my Application.java class (the class with main method and @SpringBootApplication annotation) located in different but parallel package with @Controller class.
The thing is that Application.java class should be in same or on top of all other packages, then we don't need any @ComponentScan and all beans will be scanned automatically. For example: if Application.java located in com.person and all application beans located in com.person, then it will work without @ComponentScan.
回答7:
As the one who has struggled with the issue, if you found provided solution didn't work.
Please check whether you put source files at the root level directly, for instance,src\main\java\xxx.java
It has negative effect to project but I don't know the root cause. Anyway,
Please put source files to at least a self-created package like:
src\main\java\pack1\xxx.java
Try other settings again. It did solve my problem.
回答8:
You just only define a package name in @ComponentScan like :
@SpringBootApplication
@ComponentScan({"com.project.pck_name"})
public class MainClassHome {
public static void main(String[] args) {
SpringApplication.run(MainClassHome.class, args);
}
}
and update project after that:- right click on Your project -> maven -> update project
回答9:
Instead of using ComponentsScan, we can use @Import.
@Configuration
@Import({PersonController.class})
public class MainClassHome {
public static void main(String[] args) {
SpringApplication.run(MainClassHome.class, args);
}
}
来源:https://stackoverflow.com/questions/33039774/restcontroller-in-other-package-doesnt-work