web-dev-qa-db-fra.com

Spring Boot: Impossible d'accéder à REST Controller sur localhost (404)

J'essaie d'adapter l'exemple REST Controller sur le site Web de Spring Boot. Malheureusement, j'ai l'erreur suivante lorsque j'essaie d'accéder à l'URL localhost:8080/item.

{
  "timestamp": 1436442596410,
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/item"
}

POM:

<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>SpringBootTest</groupId>
   <artifactId>SpringBootTest</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <properties>
      <javaVersion>1.8</javaVersion>
      <mainClassPackage>com.Nice.application</mainClassPackage>
      <mainClass>${mainClassPackage}.InventoryApp</mainClass>
   </properties>

   <build>
      <plugins>
         <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
               <source>${javaVersion}</source>
               <target>${javaVersion}</target>
            </configuration>
         </plugin>

         <!-- Makes the Spring Boot app executable for a jar file. The additional configuration is needed for the cmd: mvn spring-boot:repackage 
            OR mvn spring-boot:run -->
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>

            <configuration>
               <mainClass>${mainClass}</mainClass>
               <layout>Zip</layout>
            </configuration>
            <executions>
               <execution>
                  <goals>
                     <goal>repackage</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>

         <!-- Create a jar with a manifest -->
         <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
               <archive>
                  <manifest>
                     <mainClass>${mainClass}</mainClass>
                  </manifest>
               </archive>
            </configuration>
         </plugin>
      </plugins>
   </build>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <!-- Import dependency management from Spring Boot. This replaces the usage of the Spring Boot parent POM file. -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.2.5.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>

         <!-- more comfortable usage of several features when developing in an IDE. Developer tools are automatically disabled when 
            running a fully packaged application. If your application is launched using Java -jar or if it’s started using a special classloader, 
            then it is considered a 'production application'. Applications that use spring-boot-devtools will automatically restart whenever files 
            on the classpath change. -->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <dependencies>
      <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>com.google.guava</groupId>
         <artifactId>guava</artifactId>
         <version>15.0</version>
      </dependency>
   </dependencies>
</project>

Application de démarrage:

package com.Nice.application;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class InventoryApp {
   public static void main( String[] args ) {
      SpringApplication.run( InventoryApp.class, args );
   }
}

Contrôleur REST:

package com.Nice.controller; 
@RestController // shorthand for @Controller and @ResponseBody rolled together
public class ItemInventoryController {
   public ItemInventoryController() {
   }

   @RequestMapping( "/item" )
   public String getStockItem() {
      return "It's working...!";
   }

}

Je construis ce projet avec Maven. Lancé comme jar (spring-boot: run) et aussi à l'intérieur de IDE (Eclipse).

Journal de la console:

2015-07-09 14:21:52.132  INFO 1204 --- [           main] c.b.i.p.s.e.i.a.InventoryApp          : Starting InventoryApp on 101010002016M with PID 1204 (C:\Eclipse_workspace\SpringBootTest\target\classes started by MFE in C:\Eclipse_workspace\SpringBootTest)
2015-07-09 14:21:52.165  INFO 1204 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7a3d45bd: startup date [Thu Jul 09 14:21:52 CEST 2015]; root of context hierarchy
2015-07-09 14:21:52.661  INFO 1204 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2015-07-09 14:21:53.430  INFO 1204 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2015-07-09 14:21:53.624  INFO 1204 --- [           main] o.Apache.catalina.core.StandardService   : Starting service Tomcat
2015-07-09 14:21:53.625  INFO 1204 --- [           main] org.Apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.23
2015-07-09 14:21:53.731  INFO 1204 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2015-07-09 14:21:53.731  INFO 1204 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1569 ms
2015-07-09 14:21:54.281  INFO 1204 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2015-07-09 14:21:54.285  INFO 1204 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-07-09 14:21:54.285  INFO 1204 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2015-07-09 14:21:54.508  INFO 1204 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7a3d45bd: startup date [Thu Jul 09 14:21:52 CEST 2015]; root of context hierarchy
2015-07-09 14:21:54.573  INFO 1204 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<Java.util.Map<Java.lang.String, Java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2015-07-09 14:21:54.573  INFO 1204 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
2015-07-09 14:21:54.594  INFO 1204 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-07-09 14:21:54.594  INFO 1204 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-07-09 14:21:54.633  INFO 1204 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-07-09 14:21:54.710  INFO 1204 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2015-07-09 14:21:54.793  INFO 1204 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2015-07-09 14:21:54.795  INFO 1204 --- [           main] c.b.i.p.s.e.i.a.InventoryApp          : Started InventoryApp in 2.885 seconds (JVM running for 3.227)
2015-07-09 14:22:10.911  INFO 1204 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2015-07-09 14:22:10.911  INFO 1204 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2015-07-09 14:22:10.926  INFO 1204 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 15 ms

Ce que j'ai essayé jusqu'à présent:

  • Accéder à l'URL avec le nom de l'application (InventoryApp)
  • Mettez un autre @RequestMapping("/") au niveau classe de la ItemInventoryController

D'après ce que j'ai compris, je n'aurai pas besoin d'un contexte d'application lorsque j'utilise Spring Boot. Ai-je raison?

Que puis-je faire pour accéder à la méthode via une URL?

78
mchlfchr

Essayez d'ajouter ce qui suit à votre classe InventoryApp

@SpringBootApplication
@ComponentScan(basePackageClasses = ItemInventoryController.class)
public class InventoryApp {
...

spring-boot recherchera les composants des paquets ci-dessous com.Nice.application, donc si votre contrôleur est dans com.Nice.controller, vous devez le rechercher explicitement.

149
MattR

Ajout à la réponse de MattR:

Comme indiqué dans ici , @SpringBootApplication insère automatiquement les annotations nécessaires: @Configuration, @EnableAutoConfiguration, ainsi que @ComponentScan; toutefois, le @ComponentScan ne cherchera que les composants du même package que l'application, dans ce cas votre com.Nice.application, alors que votre contrôleur réside dans com.Nice.controller. C'est pourquoi vous obtenez 404 parce que l'application n'a pas trouvé le contrôleur dans le package application.

40
cipley

Les développeurs SpringBoot recommandent de localiser votre classe d'application principale dans un package racine au-dessus des autres classes. L'utilisation d'un package racine permet également d'utiliser l'annotation @ComponentScan sans avoir à spécifier un attribut basePackage . Informations détaillées Mais assurez-vous que le package racine personnalisé existe.

8
torina

Même réponse 404 après le service exécuté avec le code ci-dessous

@Controller
@RequestMapping("/duecreate/v1.0")
public class DueCreateController {

}

Réponse:

{
"timestamp": 1529692263422,
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/duecreate/v1.0/status"
}

après avoir changé le code ci-dessous, j'ai reçu une réponse appropriée

@RestController
@RequestMapping("/duecreate/v1.0")
public class DueCreateController {

}

Réponse:

{
"batchId": "DUE1529673844630",
"batchType": null,
"executionDate": null,
"status": "OPEN"
}
7
MahiA

J'ai eu ce problème et ce que vous devez faire est de réparer vos paquets. Si vous avez téléchargé ce projet à partir de http://start.spring.io/ , vous avez votre classe principale dans un package. Par exemple, si le package de la classe principale est: "com.example", votre contrôleur doit être dans le package: "com.example.controller". J'espère que cela t'aides.

4
f.trajkovski

Il y a 2 méthode pour surmonter cela

Méthode 1) Placez l'application de démarrage au début de la structure de package et laissez tous les contrôleurs à l'intérieur. Exemple: package com.spring.boot.app; - Vous démarrez l’application (c'est-à-dire la méthode principale -SpringApplication.run (App.class, args);)

Vous restez Controller avec la même structure de package. Exemple: package com.spring.boot.app.rest;

Méthode 2) Définir explicitement le contrôleur dans le package de démarrage.

La méthode 1 est plus propre.

J'espère que cela aidera.

4

Vous devez modifier la classe Starter-Application comme indiqué ci-dessous.

@SpringBootApplication

@EnableAutoConfiguration

@ComponentScan(basePackages="com.Nice.application")

@EnableJpaRepositories("com.spring.app.repository")

public class InventoryApp extends SpringBootServletInitializer {..........

Et mettez à jour la structure des packages de contrôleur, de service et de référentiel comme indiqué ci-dessous.

Exemple: contrôleur REST

package com.Nice.controller; -> Il doit être modifié comme
package com.Nice.application.controller;

Vous devez suivre la structure de package appropriée pour tous les packages qui se trouvent dans le flux Spring Boot MVC.

Ainsi, si vous modifiez correctement les structures de paquet de votre projet, votre application Spring Boot fonctionnera correctement.

2
Anjan

J'ai eu exactement la même erreur, je ne donnais pas le paquet de base. Donner le bon paquet de base, le résoudre.

package com.ymc.backend.ymcbe;

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

@SpringBootApplication
@ComponentScan(basePackages="com.ymc.backend")
public class YmcbeApplication {

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

}

Remarque: ne pas inclure .controller @ComponentScan (basePackages = "com.ymc.backend.controller") car j'ai beaucoup d'autres classes de composants que mon projet n'analyse pas si je viens de donner .controller

Voici mon exemple de contrôleur:

package com.ymc.backend.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@CrossOrigin
@RequestMapping(value = "/user")
public class UserController {

    @PostMapping("/sendOTP")
    public String sendOTP() {
        return "OTP sent";
    };


}
0

Parfois, les bottes de printemps se comportent bizarrement. J'ai spécifié ci-dessous dans la classe d'application et cela fonctionne:

@ComponentScan("com.seic.deliveryautomation.controller")
0
Love Kumar

Remplacez @RequestMapping( "/item" ) par @GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE).

Cela aidera peut-être quelqu'un.

0
Ihor Khomiak

J'ai eu le problème 404, à cause de Sensibilité à la casse.

Par exemple, @RequestMapping(value = "/api/getEmployeeData",method = RequestMethod.GET) doit être accessible à l'aide de http://www.example.com/api/getEmployeeData. Si nous utilisons http://www.example.com/api/getemployeedata, nous obtiendrons l'erreur 404.

Note: http://www.example.com est juste pour la référence que j'ai mentionnée ci-dessus. Ce devrait être votre nom de domaine où vous avez hébergé votre application.

Après beaucoup de difficultés et d’appliquer toutes les autres réponses de cet article, j’ai compris que le problème ne concernait que l’URL. Ce pourrait être un problème idiot. Mais ça m'a coûté 2 heures. J'espère donc que cela aidera quelqu'un.

0
Mahendran Sakkarai