@RestController в другом пакете не работает

Я начинаю с изучения Spring, и я создаю базовый проект, который создает базу данных, вставляет значения и затем печатает его в веб-браузере. Моя проблема в том, что когда у меня есть RestController в том же пакете, что и main class - это нормально, но я хочу распространить его на другой пакет, и когда я создаю новый пакет, переместите 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 пакет, я пишу в web brower http://localhost:8080/persons и оно работает правильно... Но я хочу двигаться PersonController.java to com.controller пакет, и когда я переместил его, мои вебброверы зовут меня

произошла непредвиденная ошибка (тип=не найден, статус=404). Никакое сообщение доступно

и я понятия не имею, что я должен сделать, чтобы восстановить его. Может быть, мне стоит что-то изменить в моем pom.xml ??

мой пом.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>

6 ответов


использовать базовые пакеты:

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

у меня была та же проблема, что и ответы, представленные здесь, работали для меня, но мне пришлось добавить еще одну аннотацию spring, и она более общая в случае работы с большим количеством репозиториев. Мы имеем следующую структуру :

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

это тогда должно быть добавлено в th main

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

С помощью @SpringBootApplication аннотация эквивалентна использованию @Configuration, @EnableAutoConfiguration и @ComponentScan.

из документации:

ComponentScan настраивает директивы сканирования компонентов для использования с @Классы конфигурации. Обеспечивает поддержку параллельно с Spring XML элемент.

один из basePackageClasses (), basePackages () или его значение псевдонима () может указывается для определения конкретных пакетов для сканирования. Если конкретные пакеты не определены сканирование будет происходить из пакета класса с эта аннотация.

вы можете либо переместить его, как вы делали или указать basePackages на @ComponentScan.


можно использовать @ComponentScan (basePackages = {"include your package name here"}).

также, если у вас есть какой-то общий формат именования пакетов, мы можем включить только общую часть имени пакета с * как @ComponentScan(basePackages = { "com.*"}, Так что все пакеты, имеющие это общее имя пакета, будут сканироваться.


У меня была та же проблема, но внезапно обнаружил, что мое приложение.класс java (класс с основным методом и аннотацией @SpringBootApplication), расположенный в другом, но параллельном пакете с классом @Controller.

дело в том, что приложение.класс java должен быть в том же или поверх всех других пакетов, тогда нам не нужен @ComponentScan, и все бобы будут сканироваться автоматически. Например: если применение.java расположен в com.человек и все бобовые, расположенную в com.человек, тогда он будет работать без @ComponentScan.


как тот, кто боролся с проблемой, если вы нашли предоставленное решение не сработало.
Пожалуйста, проверьте, помещаете ли вы исходные файлы непосредственно на корневой уровень, например,
src\main\java\xxx.java

это имеет отрицательный эффект для проекта, но я не знаю основную причину. Во всяком случае,

пожалуйста, поместите исходные файлы, по крайней мере, самостоятельно созданный пакет, как: src\main\java\pack1\xxx.java

повторите попытку других настроек. Это решило мою проблему.