Я пытаюсь адаптировать пример контроллера REST на веб-сайте Spring Boot. К сожалению, при попытке получить доступ к localhost:8080/item
URL-адресу возникает следующая ошибка .
{
"timestamp": 1436442596410,
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/item"
}
ПОМ:
<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>
Стартовое приложение:
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-контроллер:
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...!";
}
}
Я создаю этот проект с Maven. Запустил его как jar (spring-boot: run), а также внутри IDE (Eclipse).
Журнал консоли:
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
Что я пробовал до сих пор:
- Доступ к URL-адресу с именем приложения (InventoryApp)
- Поставьте другой
@RequestMapping("/")
на уровне классаItemInventoryController
Насколько я понял, мне не понадобится контекст приложения при использовании Spring Boot. Я прав?
Что еще я могу сделать, чтобы получить доступ к методу через URL?
java
rest
spring-boot
mchlfchr
источник
источник
Ответы:
Попробуйте добавить следующее в свой класс InventoryApp
Spring-boot будет сканировать компоненты в пакетах ниже
com.nice.application
, поэтому, если ваш контроллер включен,com.nice.controller
вам нужно сканировать его явно.источник
@SpringBootApplication
включает@Configuration
Добавление ответа MattR в:
Как указано в здесь ,
@SpringBootApplication
автоматически вставляет необходимые аннотации:@Configuration
,@EnableAutoConfiguration
, а также@ComponentScan
; однако он@ComponentScan
будет искать только компоненты в том же пакете, что и приложение, в данном случае вашcom.nice.application
, тогда как ваш контроллер находится вcom.nice.controller
. Вот почему вы получаете 404, потому что приложение не нашло контроллер вapplication
пакете.источник
Разработчики SpringBoot рекомендуют размещать основной класс вашего приложения в корневом пакете над другими классами. Использование корневого пакета также позволяет использовать аннотацию @ComponentScan без необходимости указывать атрибут basePackage . Подробная информация Но убедитесь, что пользовательский корневой пакет существует.
источник
Тот же ответ 404, который я получил после выполнения службы с приведенным ниже кодом
Отклик:
после изменения его на код ниже я получил правильный ответ
Отклик:
источник
@Controller
->@RestController
У меня была эта проблема, и вам нужно исправить свои пакеты. Если вы загрузили этот проект с http://start.spring.io/, значит, у вас есть основной класс в каком-то пакете. Например, если пакет для основного класса: «com.example», тогда и ваш контроллер должен быть в пакете: «com.example.controller». Надеюсь это поможет.
источник
Есть 2 способа преодолеть это
Поместите загрузочное приложение в начало структуры пакета и поместите в него весь контроллер.
Пример :
пакет com.spring.boot.app; - Вы загружаете приложение (т.е. основной метод -SpringApplication.run (App.class, args);)
Вы оставите контроллер с той же структурой пакета. Пример: package com.spring.boot.app.rest;
Явно определите контроллер в загрузочном пакете.
Метод 1 чище.
источник
Вам необходимо изменить класс Starter-Application, как показано ниже.
И обновите структуру пакетов Controller, Service и Repository, как я упоминал ниже.
Пример: REST-контроллер
package com.nice.controller;
-> Он должен быть изменен какpackage com.nice.application.controller;
Вам необходимо соблюдать правильную структуру пакетов для всех пакетов, которые находятся в потоке Spring Boot MVC.
Итак, если вы правильно измените структуру пакетов вашего проекта, ваше приложение для загрузки Spring будет работать правильно.
источник
Заменить
@RequestMapping( "/item" )
на@GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE)
.Может, это кому-нибудь поможет.
источник
name
а неvalue
в@GetMapping
.У меня была точно такая же ошибка, я не давал базовый пакет. Предоставив правильный базовый пакет, переделал его.
Вот мой образец контроллера:
источник
Иногда пружинный ботинок ведет себя странно. Я указал ниже в классе приложения, и он работает:
источник
У меня проблема 404 из-за чувствительности к регистру URL .
Например,
@RequestMapping(value = "/api/getEmployeeData",method = RequestMethod.GET)
к нему можно получить доступ с помощьюhttp://www.example.com/api/getEmployeeData
. Если мы используемhttp://www.example.com/api/getemployeedata
, то получим ошибку 404.Примечание:
http://www.example.com
только для справки, о которой я упоминал выше. Это должно быть ваше доменное имя, на котором вы разместили свое приложение.После долгой борьбы и применения всех остальных ответов в этом посте я понял, что проблема только в этом URL-адресе. Это может быть глупая проблема. Но это стоило мне 2 часа. Так что я надеюсь, что это кому-то поможет.
источник
для меня я добавлял spring-web вместо spring-boot-starter-web в свой pom.xml
когда я заменяю его с spring-web на spring-boot-starter-web, все сопоставления отображаются в журнале консоли.
источник
Это также работает, если мы используем следующее:
источник
Возможно, на порту 8080 работает что-то еще, и вы на самом деле подключаетесь к нему по ошибке.
Обязательно проверьте это, особенно если у вас есть докеры, которые вызывают другие службы, которые вы не контролируете, и перенаправляют эти службы.
источник
Проблема в структуре вашего пакета. Приложение Spring Boot Application имеет особую структуру пакета, позволяющую контексту Spring сканировать и загружать различные bean-компоненты в своем контексте.
В com.nice.application находится ваш основной класс, а в com.nice.controller у вас есть классы контроллера.
Переместите пакет com.nice.controller в com.nice.application, чтобы Spring мог получить доступ к вашим beans.
источник
Вы можете добавить внутрь POM.
источник
Поместите свой класс springbootapplication в корневой пакет, например, если ваша служба, контроллер находится в пакете springBoot.xyz, тогда ваш основной класс должен быть в пакете springBoot, иначе он не будет сканировать следующие пакеты
источник