其他包中的@RestController不起作用

时间:2015-10-09 13:38:55

标签: java spring maven package spring-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<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>

11 个答案:

答案 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);
    }
}