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:
@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?
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.
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
.
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.
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"
}
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.
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.
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é commepackage 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.
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";
};
}
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")
Remplacez @RequestMapping( "/item" )
par @GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE)
.
Cela aidera peut-être quelqu'un.
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.