J'essaie d'adapter l'exemple du contrôleur REST sur le site Web de Spring Boot. Malheureusement, j'ai l'erreur suivante lorsque j'essaie d'accéder aulocalhost:8080/item
URL.
{
"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. Lancez-le en tant que jar (spring-boot: run) et aussi dans l'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 de la classeItemInventoryController
Pour autant que je sache, je n'aurai pas besoin d'un contexte d'application lors de l'utilisation de Spring Boot. Ai-je raison?
Que puis-je faire d'autre pour accéder à la méthode via une URL?
java
rest
spring-boot
mchlfchr
la source
la source
Réponses:
Essayez d'ajouter ce qui suit à votre classe InventoryApp
spring-boot recherchera les composants dans les packages ci
com.nice.application
- dessous , donc si votre contrôleur est danscom.nice.controller
vous devez le rechercher explicitement.la source
@SpringBootApplication
comprend@Configuration
Ajout à la réponse de MattR:
comme indiqué ici ,
@SpringBootApplication
insère automatiquement les annotations nécessaires:@Configuration
,@EnableAutoConfiguration
et aussi@ComponentScan
; cependant, le@ComponentScan
ne recherchera que les composants dans le même package que l'application, dans ce cas votrecom.nice.application
, alors que votre contrôleur réside danscom.nice.controller
. C'est pourquoi vous obtenez 404 car l'application n'a pas trouvé le contrôleur dans leapplication
package.la source
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 besoin de spécifier un attribut basePackage . Informations détaillées Mais assurez-vous que le package racine personnalisé existe.
la source
Même réponse 404 que j'ai eu après le service exécuté avec le code ci-dessous
Réponse:
après l'avoir changé en code ci-dessous, j'ai reçu une réponse appropriée
Réponse:
la source
@Controller
->@RestController
J'ai eu ce problème et ce que vous devez faire est de corriger vos paquets. Si vous avez téléchargé ce projet depuis http://start.spring.io/, alors vous avez votre classe principale dans un package. Par exemple, si le package de la classe principale est: "com.example" alors et votre contrôleur doit être dans le package: "com.example.controller". J'espère que cela t'aides.
la source
Il existe 2 méthodes pour surmonter cela
Placez l'application de démarrage au début de la structure du package et placez 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;
Définissez explicitement le contrôleur dans le package Bootup.
La méthode 1 est plus propre.
la source
Vous devez modifier la classe Starter-Application comme indiqué ci-dessous.
Et mettez à jour la structure des packages Controller, Service et Repository comme je l'ai mentionné ci-dessous.
Exemple: REST-Controller
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.
Donc, si vous modifiez correctement les structures de package de votre projet, votre application Spring Boot fonctionnera correctement.
la source
Remplacer
@RequestMapping( "/item" )
par@GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE)
.Peut-être que cela aidera quelqu'un.
la source
name
au lieu devalue
dans le@GetMapping
.J'ai eu exactement la même erreur, je ne donnais pas de package de base. Donner le paquet de base correct, le résoudre.
Voici mon exemple de contrôleur:
la source
Parfois, la botte à ressort se comporte bizarrement. J'ai spécifié ci-dessous dans la classe d'application et cela fonctionne:
la source
J'ai eu le problème 404, à cause de la sensibilité à la casse de l' URL .
Par exemple,
@RequestMapping(value = "/api/getEmployeeData",method = RequestMethod.GET)
doit être accessible en utilisanthttp://www.example.com/api/getEmployeeData
. Si nous utilisonshttp://www.example.com/api/getemployeedata
, nous obtiendrons l'erreur 404.Remarque:
http://www.example.com
est juste pour référence que j'ai mentionné ci-dessus. Il doit s'agir de votre nom de domaine où vous avez hébergé votre application.Après beaucoup de lutte et après avoir appliqué toutes les autres réponses de cet article, j'ai compris que le problème venait uniquement de cette URL. Cela pourrait être un problème idiot. Mais cela m'a coûté 2 heures. J'espère donc que cela aidera quelqu'un.
la source
pour moi, j'ajoutais spring-web au lieu de spring-boot-starter-web dans mon pom.xml
quand je le remplace de spring-web à spring-boot-starter-web, tout le mappage est affiché dans le journal de la console.
la source
Cela fonctionne également si nous utilisons comme suit:
la source
Il se peut que quelque chose d'autre fonctionne sur le port 8080 et que vous vous y connectez par erreur.
Vérifiez certainement cela, surtout si vous avez des dockers qui proposent d'autres services que vous ne contrôlez pas et qui transfèrent ces services.
la source
Le problème vient de la structure de votre package. Spring Boot Application a une structure de package spécifique pour permettre au contexte Spring d'analyser et de charger divers beans dans son contexte.
Dans com.nice.application est l'endroit où se trouve votre classe principale et dans com.nice.controller, vous avez vos classes de contrôleur.
Déplacez votre package com.nice.controller dans com.nice.application afin que Spring puisse accéder à vos beans.
la source
Vous pouvez ajouter à l'intérieur du POM.
la source
Placez votre classe springbootapplication dans le package racine.Par exemple, si votre service, le contrôleur est dans le package springBoot.xyz, votre classe principale devrait être dans le package springBoot, sinon il n'analysera pas les packages ci-dessous
la source