2015-07-09 8 views
43

Sto cercando di adattare l'esempio del controller REST sul sito Web di Spring Boot. Purtroppo ho il seguente errore quando sto cercando di accedere all'URL localhost:8080/item.Avvio a molla: impossibile accedere a REST Controller su localhost (404)

{ 
    "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-Applicazione:

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...!"; 
    } 

} 

sto costruendo questo progetto con Maven. Iniziato come jar (spring-boot: run) e anche all'interno dell'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 

Quello che ho provato finora:

  • Accesso alla URL con il nome dell'applicazione (InventoryApp)
  • In altre @RequestMapping("/") a livello di classe della ItemInventoryController

Per quanto ho capito, voglio Non è necessario un contesto applicativo quando si utilizza Spring Boot. Ho ragione?

Cos'altro posso fare per accedere al metodo tramite URL?

+0

Come si esegue l'applicazione? Puoi includere alcuni registri? – wjans

+0

Provato separatamente via Eclipse e con mvn spring-boot: run (come jar). Vedi sopra per i registri (modificato) – mchlfchr

+0

Dal registro di avvio non sembra che stia trovando il controller, in quale pacchetto si trova la classe del controller? – MattR

risposta

87

Prova ad aggiungere il seguente alla classe InventoryApp

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

primavera-boot esegue la scansione per i componenti in confezioni sotto com.nice.application, quindi se il controller è in com.nice.controller è necessario eseguire la scansione di esso in modo esplicito.

+0

questo ha aiutato, grazie – Kingamere

+0

Ho gli stessi problemi. Provo con i componentican ma niente :-(Hier la mia domanda: http://stackoverflow.com/questions/33000931/spring-boot-cannot-access-some-controllers – emoleumassi

+1

nota che' @ SpringBootApplication' include '@ Configuration' – krzakov

-11

L'URL dovrebbe essere, si manca il contesto dell'applicazione: localhost: 8080/SpringBootTest/item

+0

Il tomcat incorporato Springboot non richiede il percorso di contesto, l'applicazione viene eseguita nel contesto radice –

+4

Un consiglio di parola: non si invia una risposta di risposta a una domanda che ha ottenuto la risposta accettata entro un'ora dall'invio, sei mesi prima. – kryger

24

aggiunta alla risposta di mattr:

Come indicato nel here, @SpringBootApplication inserisce automaticamente le annotazioni necessarie: @Configuration, @EnableAutoConfiguration e anche @ComponentScan; tuttavia, lo @ComponentScan cercherà solo i componenti nello stesso pacchetto dell'app, in questo caso il tuo com.nice.application, mentre il tuo controller risiede in com.nice.controller. Ecco perché ottieni 404 perché l'app non ha trovato il controller nel pacchetto application.

+3

Nel caso in cui questo non sia completamente chiaro già dalla spiegazione sopra, la classe con l'annotazione @SpringBootApplication deve essere SOPRA o sullo stesso livello nella struttura della directory come le cose che vorresti che trovasse. Ad esempio, avevo com.app.configuration e com.app.controllers. Ho erroneamente inserito la mia classe Application in com.app.configuration, e tutto il resto in com.app.configuration ha funzionato bene, ma non è stato caricato nulla in com.app.controllers. Ho spostato la mia classe Application in com.app, i bean sono stati trovati altrove e le cose hanno iniziato a funzionare. Errore Rookie per me. – glaukommatos

+0

Aggiunta di @ComponentScan (basePackages = "com.base.package") risolto nel mio caso – Shamli

1

Ci sono 2 metodo per superare questo

Metodo 1) inserire l'applicazione avvio all'inizio della struttura del pacchetto e di riposo tutti regolatore interno Esempio: pacchetto com.spring.boot.app; - Applicazione di avvio (ad esempio Metodo principale -SpringApplication.run (App.class, args);)

Controller di riposo con la stessa struttura di pacchetto Esempio: pacchetto com.spring.boot.app.rest;

Metodo 2) Definire esplicitamente il controller nel pacchetto di avvio.

Il metodo 1 è più pulito.

Spero che questo possa essere d'aiuto.

+0

avvio di avvio molla classe di applicazione che si trova in un pacchetto diverso dal pacchetto base..se il pacchetto di base è org.someapp e se lo inseriamo nell'organizzazione .someapp.app it bombs ..: -/ –

4

Ho avuto questo problema e quello che devi fare è riparare i tuoi pacchetti. Se hai scaricato questo progetto da http://start.spring.io/, allora hai la tua classe principale in qualche pacchetto. Ad esempio se il pacchetto per la classe principale è: "com.example", quindi il controller deve essere nel pacchetto: "com.example.controller". Spero che questo ti aiuti.

1

È necessario modificare la classe dell'applicazione di avviamento come mostrato di seguito.

@SpringBootApplication 

@EnableAutoConfiguration 

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

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

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

E aggiornare la struttura dei pacchetti Controller, Servizio e Repository come indicato di seguito.

Esempio: REST-controller

package com.nice.controller; -> Deve essere modificato come
package com.nice.application.controller;

È necessario seguire una corretta struttura di pacchetto per tutti i pacchetti che sono in flusso di primavera Boot MVC.

Quindi, se si modificano correttamente le strutture del pacchetto del pacchetto di progetto, l'applicazione di avvio a molla funzionerà correttamente.

+1

EnableAutoConfiguration è incluso in @SpringBootApplication quindi è inutile aggiungerlo. – Sofiane

5

Gli sviluppatori SpringBoot consigliano di individuare la classe principale dell'applicazione in un pacchetto radice sopra le altre classi. L'utilizzo di un pacchetto radice consente inoltre di utilizzare l'annotazione @ComponentScan senza specificare un attributo basePackage . Detailed info Ma assicuratevi che il pacchetto radice personalizzato esista.

Problemi correlati