Estoy tratando de adaptar el ejemplo del controlador REST en el sitio web de Spring Boot. Desafortunadamente, tengo el siguiente error cuando intento acceder a la localhost: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>
Aplicación de inicio:
package com.nice.application;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class InventoryApp {
public static void main( String[] args ) {
SpringApplication.run( InventoryApp.class, args );
}
}
Controlador 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...!";
}
}
Estoy construyendo este proyecto con Maven. Lo inició como jar (spring-boot: run) y también dentro del IDE (Eclipse).
Registro de la consola:
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
Lo que he probado hasta ahora:
- Accediendo a la URL con el nombre de la aplicación (InventoryApp)
- Pon otro
@RequestMapping("/")
a nivel de clase delItemInventoryController
Por lo que entendí, no necesitaré un contexto de aplicación cuando use Spring Boot. Estoy en lo cierto?
¿Qué más puedo hacer para acceder al método a través de URL?
java
rest
spring-boot
mchlfchr
fuente
fuente
Respuestas:
Intente agregar lo siguiente a su clase InventoryApp
spring-boot buscará componentes en los paquetes a continuación
com.nice.application
, por lo que si su controlador está encom.nice.controller
, debe buscarlo explícitamente.fuente
@SpringBootApplication
incluye@Configuration
Agregando a la respuesta de MattR:
Como se indica en aquí ,
@SpringBootApplication
inserta automáticamente las anotaciones necesarias:@Configuration
,@EnableAutoConfiguration
y también@ComponentScan
; sin embargo,@ComponentScan
solo buscará los componentes en el mismo paquete que la aplicación, en este caso sucom.nice.application
, mientras que su controlador reside encom.nice.controller
. Es por eso que obtienes 404 porque la aplicación no encontró el controlador en elapplication
paquete.fuente
Los desarrolladores de SpringBoot recomiendan ubicar su clase de aplicación principal en un paquete raíz por encima de otras clases. El uso de un paquete raíz también permite utilizar la anotación @ComponentScan sin necesidad de especificar un atributo basePackage . Información detallada Pero asegúrese de que exista el paquete raíz personalizado.
fuente
La misma respuesta 404 que obtuve después de ejecutar el servicio con el siguiente código
Respuesta:
después de cambiarlo al código siguiente, recibí la respuesta adecuada
Respuesta:
fuente
@Controller
->@RestController
Tuve este problema y lo que debes hacer es arreglar tus paquetes. Si descargó este proyecto de http://start.spring.io/, entonces tiene su clase principal en algún paquete. Por ejemplo, si el paquete para la clase principal es: "com.example", entonces y su controlador debe estar en el paquete: "com.example.controller". Espero que esto ayude.
fuente
Hay 2 métodos para superar esto
Coloque la aplicación de arranque al inicio de la estructura del paquete y coloque todos los controladores en su interior.
Ejemplo:
paquete com.spring.boot.app; - Su aplicación de arranque (es decir, Método principal -SpringApplication.run (App.class, args);)
Descansas el controlador con la misma estructura de paquete Ejemplo: paquete com.spring.boot.app.rest;
Defina explícitamente el controlador en el paquete de arranque.
El método 1 es más limpio.
fuente
Necesita modificar la clase Starter-Application como se muestra a continuación.
Y actualice la estructura de los paquetes Controller, Service y Repository como mencioné a continuación.
Ejemplo: REST-Controller
package com.nice.controller;
-> Debe modificarse comopackage com.nice.application.controller;
Debe seguir la estructura de paquete adecuada para todos los paquetes que se encuentran en el flujo Spring Boot MVC.
Por lo tanto, si modifica las estructuras del paquete del paquete del proyecto correctamente, su aplicación de arranque de primavera funcionará correctamente.
fuente
Reemplazar
@RequestMapping( "/item" )
con@GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE)
.Quizás ayude a alguien.
fuente
name
lugar devalue
en el@GetMapping
.Tuve exactamente el mismo error, no estaba dando el paquete base. Dando el paquete base correcto, lo resolvió.
Aquí está mi muestra de controlador:
fuente
A veces, la bota de primavera se comporta de manera extraña. Especifiqué a continuación en la clase de aplicación y funciona:
fuente
Tengo el problema 404 debido a la sensibilidad a mayúsculas y minúsculas de la URL .
Por ejemplo, se
@RequestMapping(value = "/api/getEmployeeData",method = RequestMethod.GET)
debe acceder mediantehttp://www.example.com/api/getEmployeeData
. Si lo estamos usandohttp://www.example.com/api/getemployeedata
, obtendremos el error 404.Nota:
http://www.example.com
es solo para referencia que mencioné anteriormente. Debe ser su nombre de dominio donde alojó su aplicación.Después de mucha lucha y aplicar todas las otras respuestas en esta publicación, entendí que el problema es solo con esa URL. Puede ser un problema tonto. Pero me costó 2 horas. Así que espero que ayude a alguien.
fuente
para mí, estaba agregando spring-web en lugar de spring-boot-starter-web en mi pom.xml
cuando lo reemplazo de spring-web a spring-boot-starter-web, todo el mapeo se muestra en el registro de la consola.
fuente
También funciona si usamos lo siguiente:
fuente
Podría ser que se esté ejecutando algo más en el puerto 8080 y, en realidad, se esté conectando por error.
Definitivamente verifique eso, especialmente si tiene puertos que están mostrando otros servicios que no controla, y están reenviando esos servicios.
fuente
El problema está en la estructura de su paquete. La aplicación Spring Boot tiene una estructura de paquete específica para permitir que el contexto de Spring escanee y cargue varios beans en su contexto.
En com.nice.application es donde está su clase principal y en com.nice.controller, tiene sus clases de controlador.
Mueva su paquete com.nice.controller a com.nice.application para que Spring pueda acceder a sus beans.
fuente
Puede agregar dentro del POM.
fuente
Coloque su clase springbootapplication en el paquete raíz, por ejemplo, si su servicio, controlador está en el paquete springBoot.xyz, entonces su clase principal debe estar en el paquete springBoot; de lo contrario, no escaneará debajo de los paquetes
fuente