Ich versuche, das REST-Controller-Beispiel auf der Spring Boot-Website anzupassen. Leider habe ich den folgenden Fehler erhalten, wenn ich versuche, auf die localhost:8080/item
URL zuzugreifen .
{
"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>
Starter-Anwendung:
package com.nice.application;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class InventoryApp {
public static void main( String[] args ) {
SpringApplication.run( InventoryApp.class, args );
}
}
REST-Controller:
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...!";
}
}
Ich baue dieses Projekt mit Maven. Startete es als jar (spring-boot: run) und auch innerhalb der IDE (Eclipse).
Konsolenprotokoll:
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
Was ich bisher versucht habe:
- Zugriff auf die URL mit dem Anwendungsnamen (InventoryApp)
- Setzen Sie eine andere
@RequestMapping("/")
auf Klassenebene derItemInventoryController
Soweit ich verstanden habe, benötige ich bei Verwendung von Spring Boot keinen Anwendungskontext. Habe ich recht?
Was kann ich noch tun, um über eine URL auf die Methode zuzugreifen?
java
rest
spring-boot
mchlfchr
quelle
quelle
Antworten:
Fügen Sie Ihrer InventoryApp-Klasse Folgendes hinzu
spring-boot sucht in den folgenden Paketen nach Komponenten.
com.nice.application
Wenn sich Ihr Controller in befindetcom.nice.controller
, müssen Sie explizit danach suchen.quelle
@SpringBootApplication
enthält@Configuration
Zusätzlich zu MattR Antwort:
Wie in angegeben hier ,
@SpringBootApplication
fügt automatisch die benötigten Anmerkungen:@Configuration
,@EnableAutoConfiguration
und auch@ComponentScan
; Es wird jedoch@ComponentScan
nur nach den Komponenten im selben Paket wie die App gesucht, in diesem Fall nach Ihrencom.nice.application
, während sich Ihr Controller in befindetcom.nice.controller
. Deshalb erhalten Sie 404, weil die App den Controller nicht imapplication
Paket gefunden hat.quelle
SpringBoot-Entwickler empfehlen, Ihre Hauptanwendungsklasse in einem Root-Paket über anderen Klassen zu suchen. Durch die Verwendung eines Root-Pakets kann auch die Annotation @ComponentScan verwendet werden, ohne dass ein basePackage- Attribut angegeben werden muss. Detaillierte Informationen Stellen Sie jedoch sicher, dass das benutzerdefinierte Root-Paket vorhanden ist.
quelle
Dieselbe 404-Antwort, die ich nach der Ausführung des Dienstes mit dem folgenden Code erhalten habe
Antwort:
Nachdem ich es auf den folgenden Code geändert hatte, erhielt ich die richtige Antwort
Antwort:
quelle
@Controller
->@RestController
Ich hatte dieses Problem und Sie müssen nur Ihre Pakete reparieren. Wenn Sie dieses Projekt von http://start.spring.io/ heruntergeladen haben, haben Sie Ihre Hauptklasse in einem Paket. Wenn das Paket für die Hauptklasse beispielsweise "com.example" lautet, muss sich Ihr Controller im Paket "com.example.controller" befinden. Hoffe das hilft.
quelle
Es gibt zwei Methoden, um dies zu überwinden
Platzieren Sie die Boot-Anwendung am Anfang der Paketstruktur und legen Sie den gesamten Controller darin ab.
Beispiel:
Paket com.spring.boot.app; - Sie starten die Anwendung (dh Hauptmethode -SpringApplication.run (App.class, args);)
Sie ruhen Controller mit derselben Paketstruktur aus. Beispiel: Paket com.spring.boot.app.rest;
Definieren Sie den Controller explizit im Bootup-Paket.
Methode 1 ist sauberer.
quelle
Sie müssen die Starter-Application-Klasse wie unten gezeigt ändern.
Aktualisieren Sie die Paketstruktur für Controller, Service und Repository wie unten erwähnt.
Beispiel: REST-Controller
package com.nice.controller;
-> Es muss geändert werden alspackage com.nice.application.controller;
Sie müssen die richtige Paketstruktur für alle Pakete befolgen, die sich im Spring Boot MVC-Flow befinden.
Wenn Sie also die Paketstrukturen Ihres Projektpakets korrekt ändern, funktioniert Ihre Spring Boot-App ordnungsgemäß.
quelle
Ersetzen
@RequestMapping( "/item" )
durch@GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE)
.Vielleicht hilft es jemandem.
quelle
name
stattvalue
in der geschrieben hatte@GetMapping
.Ich hatte genau den gleichen Fehler, ich gab kein Basispaket. Geben Sie das richtige Basispaket und lösen Sie es erneut.
Hier ist mein Controller-Beispiel:
quelle
Manchmal verhält sich der Frühlingsstiefel komisch. Ich habe unten in der Anwendungsklasse angegeben und es funktioniert:
quelle
Ich habe das 404-Problem aufgrund der URL-Groß- / Kleinschreibung .
Zum Beispiel
@RequestMapping(value = "/api/getEmployeeData",method = RequestMethod.GET)
sollte mit zugegriffen werdenhttp://www.example.com/api/getEmployeeData
. Wenn wir verwendenhttp://www.example.com/api/getemployeedata
, erhalten wir den Fehler 404.Hinweis:
http://www.example.com
dient nur als Referenz, die ich oben erwähnt habe. Es sollte Ihr Domain-Name sein, unter dem Sie Ihre Anwendung gehostet haben.Nach viel Mühe und Anwenden aller anderen Antworten in diesem Beitrag habe ich festgestellt, dass das Problem nur bei dieser URL liegt. Es könnte ein dummes Problem sein. Aber es hat meine 2 Stunden gekostet. Also ich hoffe es wird jemandem helfen.
quelle
Für mich habe ich Spring-Web anstelle des Spring-Boot-Starter-Web in meine pom.xml eingefügt
Wenn ich es von Spring-Web zu Spring-Boot-Starter-Web ersetze, werden alle Zuordnungen im Konsolenprotokoll angezeigt.
quelle
Es funktioniert auch, wenn wir Folgendes verwenden:
quelle
Es kann sein, dass auf Port 8080 etwas anderes ausgeführt wird und Sie versehentlich eine Verbindung herstellen.
Überprüfen Sie dies auf jeden Fall, insbesondere wenn Sie Docker haben, die andere Dienste aufrufen, die Sie nicht kontrollieren, und diese Dienste über den Port weiterleiten.
quelle
Das Problem liegt in Ihrer Paketstruktur. Die Spring Boot-Anwendung verfügt über eine spezielle Paketstruktur, mit der der Spring-Kontext verschiedene Beans in seinem Kontext scannen und laden kann.
In com.nice.application befindet sich Ihre Hauptklasse und in com.nice.controller haben Sie Ihre Controller-Klassen.
Verschieben Sie Ihr com.nice.controller-Paket in com.nice.application, damit Spring auf Ihre Beans zugreifen kann.
quelle
Sie können innerhalb des POM hinzufügen.
quelle
Platzieren Sie Ihre springbootapplication-Klasse im Root-Paket. Wenn sich Ihr Dienstcontroller beispielsweise im springBoot.xyz-Paket befindet, sollte sich Ihre Hauptklasse im springBoot-Paket befinden, da sonst die folgenden Pakete nicht durchsucht werden
quelle