2015-07-09 5 views
43

Ich versuche, das REST-Controller-Beispiel auf der Spring Boot-Website anzupassen. Leider habe ich den folgenden Fehler, wenn ich versuche, auf die localhost:8080/item URL zuzugreifen.Spring Boot: Auf REST-Controller kann nicht auf localhost (404) zugegriffen werden

{ 
    "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. Begann es als jar (Spring-Boot: run) und auch innerhalb der IDE (Eclipse).

Console Log:

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[email protected]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[email protected]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:

  • der URL-Zugriff mit dem Anwendungsnamen (InventoryApp)
  • Legen Sie eine andere @RequestMapping("/") auf Klassenebene des ItemInventoryController

Soweit ich verstanden habe, ich wo benötige keinen Anwendungskontext bei der Verwendung von Spring Boot. Habe ich recht?

Was kann ich noch tun, um über URL auf die Methode zuzugreifen?

+0

Wie läuft die Anwendung? Kannst du vielleicht ein paar Logs einbinden? – wjans

+0

Versucht es separat über Eclipse und mit mvn Spring-Boot: run (als jar). Siehe oben für Protokolle (bearbeitet) – mchlfchr

+0

Aus dem Startprotokoll sieht es nicht so aus, als ob es Ihren Controller findet, welches Paket ist Ihre Controller-Klasse? – MattR

Antwort

87

Versuchen Hinzufügen Folgendes zu Ihrer InventoryApp Klasse

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

feder Boot für Komponenten in Paketen unter com.nice.application scannen, so dass, wenn Ihr Controller in com.nice.controller ist es Ihnen ausdrücklich scannen müssen.

+0

das half, danke – Kingamere

+0

Ich habe die gleichen Probleme. Ich probiere mit dem componentscan aber nichts aus :-(Hier meine Frage: http://stackoverflow.com/questions/33000931/spring-boot-cannot-access-some-controllers – emoleumassi

+1

Bitte beachten Sie, dass '@ SpringBootApplication' '' Konfiguration 'beinhaltet – krzakov

-11

Ihre URL sollte sein, können Sie den Anwendungskontext fehlen: localhost: 8080/SpringBootTest/item

+0

Springboot eingebetteter Tomcat erfordert keinen Kontextpfad, die Anwendung wird im Stammkontext ausgeführt –

+4

Ein Ratschlag: Sie geben keine Ratenantwort auf eine Frage ab, die ihre akzeptierte Antwort innerhalb einer Stunde nach der Veröffentlichung ein halbes Jahr früher erhalten hat. – kryger

24

zu MattR Antwort hinzu:

Wie in here angegeben, @SpringBootApplication fügt automatisch die benötigten Anmerkungen: @Configuration, @EnableAutoConfiguration, und auch @ComponentScan; Allerdings wird @ComponentScan nur nach den Komponenten im selben Paket wie die App suchen, in diesem Fall Ihre com.nice.application, während sich Ihr Controller in com.nice.controller befindet. Deshalb erhalten Sie 404, weil die App den Controller im application Paket nicht gefunden hat.

+3

Wenn dies aus der obigen Erklärung nicht vollständig klar ist, muss die Klasse mit der @SpringBootApplication-Annotation in der Verzeichnisstruktur OBEN oder auf derselben Ebene wie die Objekte sein, die Sie finden möchten. Zum Beispiel hatte ich com.app.configuration und com.app.controllers. Ich habe fälschlicherweise meine Application-Klasse in com.app.configuration eingetragen, und alles andere in com.app.configuration hat funktioniert, aber in com.app.controllers wurde nichts geladen. Ich habe meine Application-Klasse in com.app verschoben und die Beans wurden woanders gefunden und die Dinge begannen zu arbeiten. Anfängerfehler für mich. – glaukommatos

+0

Hinzufügen von @ComponentScan (basePackages = "com.base.package") löste es in meinem Fall – Shamli

1

Es gibt 2 Verfahren, um dies zu Beginn des Startvorgangs Applikationsort

Methode 1) zur Überwindung der Packungsstruktur und ruhen alle Regler Inneren Beispiel: Paket com.spring.boot.app; - Sie starten die Anwendung (z. B. Hauptmethode -SpringApplication.run (App.Klasse, Argumente);)

Sie ruhen Controller in mit der gleichen Paketstruktur Beispiel: Paket com.spring.boot.app.rest;

Methode 2) Definieren Sie explizit den Controller im Bootup-Paket.

Methode 1 ist sauberer.

Hoffe, das wird helfen.

+0

Spring Boot hasst Anwendung Klasse unter einigen Paket als Basispaket .. wenn Basispaket ist org.someapp und wenn wir es unter org .someapp.app it bombs ..: -/ –

4

Ich hatte dieses Problem und was Sie tun müssen, ist Ihre Pakete zu beheben. Wenn Sie dieses Projekt von http://start.spring.io/ heruntergeladen haben, dann haben Sie Ihre Hauptklasse in einem Paket. Zum Beispiel, wenn das Paket für die Hauptklasse ist: "com.example" dann und Ihr Controller muss im Paket sein: "com.example.controller". Hoffe das hilft.

1

Sie müssen die Starter-Application-Klasse wie folgt ändern.

@SpringBootApplication 

@EnableAutoConfiguration 

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

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

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

Und aktualisieren Sie die Controller, Service und Repository-Pakete wie unten erwähnt.

Beispiel: REST-Controller-

package com.nice.controller; -> Es hat als
package com.nice.application.controller;

Sie müssen geändert werden, für alle Pakete die richtige Paketstruktur folgen, die im Frühjahr Boot-MVC-Flow sind.

Also, wenn Sie Ihre Projekt Bundle-Paketstrukturen richtig ändern, dann wird Ihre Spring-Boot-App ordnungsgemäß funktionieren.

+1

EnableAutoConfiguration ist in @SpringBootApplication enthalten, so dass es sinnlos ist, es hinzuzufügen. – Sofiane

5

SpringBoot-Entwickler empfehlen, Ihre Hauptanwendungsklasse in einem Root-Paket über anderen Klassen zu finden. Bei Verwendung eines Root-Pakets kann auch die Annotation @ComponentScan verwendet werden, ohne dass ein Attribut basePackage angegeben werden muss. Detailed info Aber stellen Sie sicher, dass das benutzerdefinierte root-Paket vorhanden ist.

Verwandte Themen