web-dev-qa-db-fra.com

Cette application n'a pas de mappage explicite pour/error

J'ai utilisé maven pour faire le tutoriel https://spring.io/guides/gs/uploading-files/
Tous les codes que j'ai utilisés ont été copiés.

L'application peut fonctionner, mais j'obtiens l'erreur:

Page d'erreur Whitelabel Cette application n'a pas de mappage explicite pour/error, vous la voyez donc comme une solution de secours. Mar 30 Juin 17:24:02 CST 2015 Une erreur inattendue s'est produite (type = Introuvable, statut = 404). Aucun message disponible

Comment puis-je le réparer?

62
Deng Steve

Assurez-vous que votre classe principale est dans un paquet racine au-dessus des autres classes.

Lorsque vous exécutez une application de démarrage Spring (c'est-à-dire une classe annotée avec @SpringBootApplication), Spring analyse uniquement les classes situées sous votre package de classe principal.

com
   +- APP
         +- Application.Java  <--- your main class should be here, above your controller classes
         |
         +- model
         |   +- user.Java
         +- controller
             +- UserController.Java
81
vignesh Subash

Lorsque nous créons une application de démarrage Spring, nous l'annotons avec une annotation @SpringBootApplication. Cette annotation "encapsule" de nombreuses autres annotations nécessaires au bon fonctionnement de l'application. Une annotation de ce type est l'annotation @ComponentScan. Cette annotation indique à Spring de rechercher les composants Spring et de configurer l'application à exécuter.

Votre classe d'application doit figurer en haut de la hiérarchie de vos packages pour que Spring puisse analyser les sous-packages et connaître les autres composants requis.

package com.test.spring.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

Sous l'extrait de code fonctionne car le package du contrôleur est sous le package com.test.spring.boot

package com.test.spring.boot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @RequestMapping("/")
    public String home(){
        return "Hello World!";
    }
}

L'extrait de code ci-dessous ne fonctionne PAS car le package du contrôleur n'est PAS sous le package com.test.spring.boot

package com.test.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

     @RequestMapping("/")
     public String home(){
         return "Hello World!";
     }
 }

A partir de la documentation Spring Boot:

De nombreux développeurs Spring Boot ont toujours leur classe principale annotée avec @Configuration, @EnableAutoConfiguration et @ComponentScan. Comme ces annotations sont si souvent utilisées ensemble (surtout si vous suivez les meilleures pratiques ci-dessus), Spring Boot fournit un alternative commode @SpringBootApplication.

L'annotation @SpringBootApplication équivaut à utiliser @Configuration, @EnableAutoConfiguration et @ComponentScan avec leur attributs par défaut

37
Somnath Musib

Vous pouvez résoudre ce problème en ajoutant une ErrorController dans votre application. Vous pouvez demander au contrôleur d’erreur de retourner la vue dont vous avez besoin. 

Le contrôleur d'erreur dans mon application ressemble à ceci:

import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import Java.util.Map;

/**
 * Basic Controller which is called for unhandled errors
 */
@Controller
public class AppErrorController implements ErrorController{

    /**
     * Error Attributes in the Application
     */
    private ErrorAttributes errorAttributes;

    private final static String ERROR_PATH = "/error";

    /**
     * Controller for the Error Controller
     * @param errorAttributes
     */
    public AppErrorController(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    /**
     * Supports the HTML Error View
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH, produces = "text/html")
    public ModelAndView errorHtml(HttpServletRequest request) {
        return new ModelAndView("/errors/error", getErrorAttributes(request, false));
    }

    /**
     * Supports other formats like JSON, XML
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH)
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request));
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }

    /**
     * Returns the path of the error page.
     *
     * @return the error path
     */
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }


    private boolean getTraceParameter(HttpServletRequest request) {
        String parameter = request.getParameter("trace");
        if (parameter == null) {
            return false;
        }
        return !"false".equals(parameter.toLowerCase());
    }

    private Map<String, Object> getErrorAttributes(HttpServletRequest request,
                                                   boolean includeStackTrace) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        return this.errorAttributes.getErrorAttributes(requestAttributes,
                includeStackTrace);
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request
                .getAttribute("javax.servlet.error.status_code");
        if (statusCode != null) {
            try {
                return HttpStatus.valueOf(statusCode);
            }
            catch (Exception ex) {
            }
        }
        return HttpStatus.INTERNAL_SERVER_ERROR;
    }
}

La classe ci-dessus est basée sur Springs BasicErrorController class.

Vous pouvez instancier la ErrorController ci-dessus comme ceci dans un fichier @Configuration:

 @Autowired
 private ErrorAttributes errorAttributes;

 @Bean
 public AppErrorController appErrorController(){return new AppErrorController(errorAttributes);}

Vous pouvez choisir de remplacer la valeur par défaut ErrorAttributes en implémentant ErrorAttributes . Mais dans la plupart des cas, le DefaultErrorAttributes devrait suffire.

33
owaism

dans mon cas, c'est à cause de la position du paquet, ce qui signifie que le paquet du contrôleur doit être supérieur au paquet de la classe principale 

si mon package de classe principal est package co.companyname.spring.tutorial;, tout package de contrôleur doit package co.companyname.spring.tutorial.WHAT_EVER_HERE;

package co.companyname.spring.tutorial; // package for main class
@SpringBootApplication
public class FirstProjectApplication {

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


package co.companyname.spring.tutorial.controllers; // package for controllers 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController 
public class HelloController { 

@RequestMapping("/hello")  
public String hello() {   
 return "Hello, world"; 
 }}

après avoir terminé le codage, appuyez sur le tableau de bord de démarrage

 enter image description here

une dernière chose à faire pour que votre contrôleur mappe ou pas simplement console, vous devriez voir quelque chose smilliar 

Mapped "{[/hello]}" onto public Java.lang.String co.companyname.spring.tutorial.controllers.HelloController.hello()

bonne codage

10
Mina Fawzy

Dans mon cas, la classe de contrôleur était annotée avec @Controller. Changer cela en @RestController a résolu le problème. Fondamentalement, @RestController est @Controller + @ResponseBodyPour utiliser @RestController ou @Controller avec l'annotation @ResponseBody avec chaque méthode.

Quelques notes utiles ici: https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/

7
mykey

Essayez d'ajouter la dépendance.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
5
Sree

J'ai ajouté cette dépendance et cela a résolu mon problème.

<dependency>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
4
Ekene Oguikpu

Vous pourriez obtenir l'erreur c'est-à-dire.

"Cette application n'a pas de mappage explicite pour/error, vous la voyez donc comme une solution de secours."

C’est parce qu’il n’analyse pas vos classes Controller & Service que vous devez spécifier dans votre classe main () comme ceci:

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
**@ComponentScan({"com.example.demo", "controller", "service"})**
public class SpringBootMvcExample1Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMvcExample1Application.class, args);
    }
}

Remarque: Ici, j'ai spécifié diverses classes telles que démo, contrôleur et service à analyser, pour que cela fonctionne correctement.

3
Rupesh Bharuka

Dans la classe principale, après la configuration "@SpringBootApplication", ajouter "@ComponentScan" sans aucun argument a fonctionné pour moi !!!

Classe principale:

@SpringBootApplication
@ComponentScan
public class CommentStoreApplication {

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

    }
}

Classe RestController:

@RestController
public class CommentStoreApp {

    @RequestMapping("/") 
    public String hello() {
        return "Hello World!";
    }
}

P.S: Ne manquez pas de lancer les commandes mvn clean et mvn install avant de lancer l'application

3
Harika

Cela se produit lorsqu'une page d'erreur explicite n'est pas définie. Pour définir une page d'erreur, créez un mappage de/error avec une vue . le code ci-dessous correspond à une valeur de chaîne renvoyée en cas d'erreur.

package com.rumango.controller;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController implements ErrorController{
    private final static String PATH = "/error";
    @Override
    @RequestMapping(PATH)
    @ResponseBody
    public String getErrorPath() {
        // TODO Auto-generated method stub
        return "No Mapping Found";
    }

}
3
prabhat kumar

Je développe l’application Spring Boot depuis quelques semaines .. Et j’ai eu la même erreur que celle ci-dessous; 

Whitelabel Error Page Cette application n'a pas de mappage explicite pour/error, vous la voyez donc comme une solution de secours . Jeu. 18 janv. 14:12:11 AST 2018 Une erreur inattendue s'est produite (type = non trouvé, statut = 404) . Aucun message disponible

Quand j’obtiens cette erreur de massage, j’ai réalisé que ma classe de contrôleur ou de contrôleur de repos est définie dans mon projet. Je veux dire que nos packages de contrôleurs ne sont pas tous identiques avec la classe principale qui inclut l'annotation @SpringBootApplication. Je veux dire que vous devez ajouter le nom de votre package de contrôleur à l'annotation @ComponentScan dans votre classe principale, qui est l'annotation @SpringBootApplication. Si vous écrivez des codes ci-dessous, votre problème sera résolu ... Le plus important est que vous devez ajouter le package de votre contrôleur à l'annotation @ComponentScan comme je l'ai fait ci-dessous

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({ "com.controller.package1, com.controller.package2, com.controller.package3, com.controller.packageN", "controller", "service" } // If our Controller class or Service class is not in the same packages we have //to add packages's name like this...directory(package) with main class
public class MainApp {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class, args);
    }
}

J'espère que ces codes vont aider quelqu'un ...

Si vous trouvez un autre moyen de résoudre cette erreur ou si vous avez des suggestions pour moi, veuillez écrire aux commentaires ... merci ...

2
Semih Erkaraca

Le problème est que vous naviguez vers localhost: 8080/au lieu de localhost: 8080/upload comme indiqué dans le guide. Spring Boot a une page d'erreur par défaut utilisée lorsque vous naviguez vers un itinéraire non défini pour éviter de divulguer des détails spécifiques au serveur (qui peuvent être considérés comme un risque de sécurité).

Vos options sont les suivantes: visiter la page de droite, ajouter votre propre page de destination ou remplacer la page d'erreur blanche .

Pour simplifier cette situation particulière, j'ai mis à jour le guide afin qu'il utilise/au lieu de/upload.

2
gregturn

Assurez-vous que jasper et jstl figurent dans la liste des dépendances:

<dependency>
    <groupId>org.Apache.Tomcat.embed</groupId>
    <artifactId>Tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

Voici un projet de démarrage qui fonctionne - https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

Auteur: Biju Kunjummen

2
Yersin

Vous devez organiser les packages de sorte que le package contenant public static (ou l'endroit où vous avez écrit @SpringBootApplication), soit le père de tous vos autres packages.

1
sakgeek

Je sais que ce n'est pas exactement la réponse à la question, mais cette question est la première qui apparaît sur Google :)

Problème ("Cette application n'a pas de mappage explicite pour/erreur") s'affiche lors d'une tentative d'accès à l'interface utilisateur Swagger.

Dans mon cas, les problèmes ont été causés par @RestController ("/ endpoint"), qui n'est pas traité correctement par swagger.

Donc, cela a entraîné des erreurs:

@RestController("/endpoint")
public class EndpointController {

Et c'était bien

@RestController
@RequestMapping("/endpoint")
public class EndpointController {
1
Elas

J'ai eu une erreur similaire, j'utilise Spring Boot et Velocity, ma solution est de vérifier le fichier application.properties, spring.velocity.toolbox-config-location et que cette propriété est incorrecte

0
叶为正

Dans le didacticiel, le contrôleur est annoté avec @Controller, qui est utilisé pour créer une mappe d'objet de modèle et trouver une vue, mais @RestController renvoie simplement l'objet et les données de l'objet sont directement écrites dans la réponse HTTP sous forme de code JSON ou XML . vous voulez voir la réponse, utilisez @RestController ou utilisez @ResponseBody également avec @Controller.

@Controller
@ResponseBody

En savoir plus: https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html#ixzz5WtrMSJHJ

0
berzerk

Moi aussi j'ai eu la même erreur et j'ai pu résoudre l'erreur en ajoutant la dépendance ci-dessous à mon pom.xml.

<dependency>
    <groupId>org.Apache.Tomcat.embed</groupId>
    <artifactId>Tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

La raison en est que nous utilisons JSP comme vue. Le conteneur de servlet intégré par défaut pour Spring Boot Starter Web est Tomcat. Pour activer la prise en charge des JSP, nous aurions besoin d’ajouter une dépendance à Tomcat-embed-jasper.

Dans mon cas, je retournais un JSP sous la vue du contrôleur . J'espère que cette réponse aidera quelqu'un qui se débat avec le même problème.

0
Sujana

J'ai eu une erreur similaire en essayant un exemple d'application Spring Boot avec Thymeleaf, j'ai essayé toutes les solutions différentes fournies malheureusement n'a pas fonctionné.

Mon erreur était que la chaîne retournée de la méthode Controller n'avait pas de vue HTML respective.

Peut-être avez-vous manqué ou il pourrait y avoir une faute de frappe dans le nom du fichier. Comme indiqué dans l'exemple à l'intérieur du contrôleur

@GetMapping("/")
public String listUploadedFiles(Model model) throws IOException {

    model.addAttribute("files", storageService.loadAll().map(
            path -> MvcUriComponentsBuilder.fromMethodName(FileUploadController.class,
                    "serveFile", path.getFileName().toString()).build().toString())
            .collect(Collectors.toList()));

    return "uploadForm";
}

la chaîne de retour doit correspondre au nom du fichier HTML à

src/main/resources/templates/uploadForm.html

Thymeleaf recherchera le fichier avec le même nom que dans le type de retour et affichera la vue. Vous pouvez essayer avec n'importe quel fichier html et donner le nom du fichier dans l'instruction return, ce qui renseignera la vue correspondante.

0
Vishal Vijayan

En utilisant Spring Boot et le fichier application.properties, je devais modifier la structure de mon projet. Les fichiers JSP doivent se trouver à cet emplacement: \ src\main\ressources\META-INF\ressources\WEB-INF\jsp. Après ce changement, mon projet fonctionne. J'ai trouvé la solution ici: https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-serve-dynamic html

0
Tom

Assurez-vous de ne pas placer votre View, JSP ou HTML dans WEB-INF ou META-INF.

Mentionnez ces détails avec soin:

spring.mvc.view.prefix
spring.mvc.view.suffix
0
Sid

Changez @Controller en @RestController dans votre classe de contrôleur et tout devrait se dérouler sans heurts.

0
supernova

Vérifiez si vous avez marqué la classe de contrôleur avec @RestController annotation.

0
Karthik Kamath

Si vous avez annoté l'interface avec requestMapping, veillez également à annoter la classe qui implémente l'interface avec @Component.

0
user11308342

Cela se produit parfois lorsque votre application Spring ne parvient pas à trouver le composant Spring et qu'elle n'est pas initialisée dans un conteneur Sprint. Vous pouvez ajouter un composant à l'aide de @ComponentScan avec votre @SpringBootApplication, comme dans l'exemple ci-dessous.

@SpringBootApplication
@ComponentScan({"model", "service"})
class MovreviewApplication {

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

}

dans l'exemple ci-dessus, le modèle et le service sont les packages de mon application.

0
Pavan T

J'étais confronté au même problème, en utilisant gradle et cela a été résolu en ajoutant les dépendances suivantes

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
compile('org.Apache.Tomcat.embed:Tomcat-embed-jasper')

plus tôt il me manquait le dernier provoquant la même erreur.

0
siddhartha attri

Dans votre fichier Java (par exemple, Viper.Java) ayant la classe principale, ajoutez: "@RestController" Et @RequestMapping ("/")

@SpringBootApplication
@RestController
public class Viper {

  @RequestMapping("/")

   public String home(){
          return "This is what i was looking for";                      
     }

public static void main( String[] args){

   SpringApplication.run(Viper.class , args);
}

}
0
Mayur Chavan

Je faisais face à ce problème et je me suis rendu compte par la suite qu'il me manquait l'annotation @Configuration dans la classe MvcConfig, qui effectue le mappage de ViewControllers et setViewNames.

Voici le contenu du fichier:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
**@Configuration**
public class MvcConfig implements WebMvcConfigurer{
   public void addViewControllers(ViewControllerRegistry registry)
   {
      registry.addViewController("/").setViewName("login");
      registry.addViewController("/login").setViewName("login");
      registry.addViewController("/dashboard").setViewName("dashboard");
   }
}

J'espère que ça aide quelqu'un !!

0

cela signifie que vous essayez d'accéder à la page qui n'y est pas .. .. supposons maintenant que votre fichier jsp se trouve dans /webapp/home.jsp si vous utilisez @RequestMapping ("/ home") dans votre code et si vous retournez "home.jsp" "; alors vous obtiendrez cette erreur si vous essayez d'accéder en utilisant localhost: port/mais si vous essayez localhost: port/home, il n'y aura pas d'erreurvous pouvez résoudre ce problème en vérifiant votre @RequestMapping ("/") ici/mapping_path de la page à laquelle vous essayez d'accéder . et vous pouvez également essayer d'ajouter une dépendance de Tomcat jaspher à partir de maven dependency

0
Jasbin karki

Dans mon cas, ce problème se produit lors de l'exécution de SpringApplication à partir d'IntelliJ après l'avoir d'abord exécuté avec maven.

Pour résoudre le problème, je lance d'abord mvn clean. Ensuite, je lance SpringApplication depuis IntelliJ. 

0
Mert Nuhoglu

cela peut arriver si vous oubliez l'annotation @RestController au-dessus de votre classe de contrôleur

et ajoutez l'annotation comme ci-dessous 

reportez-vous à l'exemple simple ci-dessous 

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;


@RestController
public class HelloController {
@RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

Assurez-vous que votre .classe principale doit être au-dessus de vos contrôleurs. Dans le cas de l'exemple suivant:

Main.class contenant:

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

EmployeeController .class contenant:

@RestController
public class EmployeeController {
    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id");
    }

    @RequestMapping(value = "/employee/save", method = RequestMethod.GET)
    public String save(){
        Employee newEmp = new Employee();
        newEmp.setAge(25);
        newEmp.setFirstName("Pikachu");
        newEmp.setId(100);
        return "Name: " + newEmp.getFirstName() + ", Age: " + newEmp.getAge() + ", Id = " + newEmp.getId();
    }
}

Si votre classe principale est dans le dossier racine, procédez comme suit: {nom du projet}/src/main/Java/main, puis assurez-vous que vos contrôleurs se trouvent sous votre classe Main. Par exemple, {nom du projet}/src/main/Java/main/controllers.

0
Abed G.

Tout ce que j'ai fait pour résoudre ce genre de problème est de mentionner l'annotation @Configuration dans MVC Config Class. 

Comme celui-ci :

package com.example;

/**
 * Created by sartika.s.hasibuan on 1/10/2017.
 */
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}
0
Sartika Hasibuan