web-dev-qa-db-fra.com

@RestController dans un autre package ne fonctionne pas

Je commence par apprendre Spring et je crée un projet de base qui crée une base de données, insère des valeurs et l’imprime ensuite dans un navigateur Web. Mon problème est que lorsque RestController se trouve dans le même package que la classe principale, tout va bien, mais je souhaite le distribuer dans un autre package. Lorsque je crée un nouveau package, déplacez RestController, il ne fonctionne pas. Laissez rencontré expliquer:

Mon projet ressemble à:

          |-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

Mon contrôleur regarde:

@RestController
public class PersonController {

    @Autowired PersonRepository personRepository;

    @RequestMapping("/persons")
    Collection<Person> persons(){
        return this.personRepository.findAll();
    }
}  

Lorsque tout est dans le package com.person, j'écris dans le navigateur Web http: // localhost: 8080/persons et que cela fonctionne correctement ... Mais je veux déplacer PersonController.Java vers com.controller, et quand je l'ai déplacé, mes webbrowers m'appellent 

Une erreur inattendue s'est produite (type = Introuvable, statut = 404). Pas de message disponible

et je n'ai aucune idée de ce que je devrais faire pour le réparer. Peut-être que je devrais changer quelque chose dans mon pom.xml ??

Mon pom.xml ressemble à

<?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>

Il est généré automatiquement, je n’écris qu’une seule dépendance

    <dependency>
        <groupId>com.h2database</groupId><artifactId>h2</artifactId>
    </dependency>
20
CeZet

Utilisez basePackages:

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

J'avais le même problème, les réponses fournies ici fonctionnaient pour moi, mais je devais ajouter une autre annotation printanière et c'est plus général dans le cas où il y aurait beaucoup de référentiels . Nous avons la structure suivante:

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

Ceci devrait alors être ajouté dans la 

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

Utiliser une annotation @SpringBootApplication équivaut à utiliser @Configuration, @EnableAutoConfiguration et @ComponentScan.

De la documentation:

ComponentScan configure les directives d'analyse des composants à utiliser avec @Configuration classes. Fournit une prise en charge parallèle à celle de Spring XML élément.

L'un des types basePackageClasses (), basePackages () ou son alias value () peut être spécifié pour définir des paquets spécifiques à analyser. Si des paquets spécifiques ne sont pas définis, l'analyse se fera à partir du package de la classe avec cette annotation.

Vous pouvez le déplacer comme vous l'avez fait ou spécifier basePackages dans @ComponentScan.

4
spm

Nous pouvons utiliser @ComponentScan (basePackages = {"include your package name here"}).

De même, si vous avez un format de nom de package commun, nous pouvons inclure uniquement une partie commune du nom de package avec * tel que @ComponentScan(basePackages = { "com.*"}, de sorte que tous les packages portant ce nom commun soient analysés.

2
Adimax

J'ai eu le même problème, mais j'ai soudainement constaté que ma classe Application.Java (la classe avec la méthode principale et l'annotation @SpringBootApplication) était située dans un package différent mais parallèle avec la classe @Controller. 

Le fait est que la classe Application.Java doit être identique ou supérieure à celle de tous les autres packages. Nous n’avons donc pas besoin de @ComponentScan et tous les beans seront analysés automatiquement. Par exemple: si Application.Java situé dans com.person et tous les beans d'application situés dans com.person, cela fonctionnera sans @ComponentScan.

1
Denys

Vous venez de définir un nom de paquet dans @ComponentScan Comme: 

@SpringBootApplication
@ComponentScan({"com.project.pck_name"})
public class MainClassHome {

    public static void main(String[] args) {
        SpringApplication.run(MainClassHome.class, args);
    }
}

et mettez à jour le projet après cela: - faites un clic droit sur Votre projet -> maven -> update project

0
Geet Thakur

En tant que personne ayant lutté contre le problème, si vous aviez trouvé la solution fournie ne fonctionnait pas.
Veuillez vérifier si vous avez mis les fichiers source directement au niveau racine, par exemple,
src\main\Java\xxx.Java

Cela a un effet négatif à projeter mais je ne connais pas la cause fondamentale. En tous cas,

Veuillez placer les fichiers sources dans au moins un package créé par vous-même, tel que: src\main\Java\pack1\xxx.Java

Essayez à nouveau les paramètres. Cela a résolu mon problème.

0
Gearon