Spring Boot: не удается получить доступ к контроллеру REST на локальном хосте (404)
Я пытаюсь адаптировать пример контроллера 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).
10 ответов:
попробуйте добавить следующее в свой класс InventoryApp
@SpringBootApplication @ComponentScan(basePackageClasses = ItemInventoryController.class) public class InventoryApp { ...
spring-boot будет сканировать компоненты в пакетах ниже
com.nice.application
, Так что если ваш контроллер находится вcom.nice.controller
вы должны сканировать его явно.
добавление к ответу MattR это:
Как указано в здесь,@SpringBootApplication
автоматически подставляет необходимые Примечания:@Configuration
,@EnableAutoConfiguration
, а также@ComponentScan
, однако@ComponentScan
будет искать только компоненты в том же пакете, что и приложение, в этом случае вашcom.nice.application
, в то время как контроллер находится вcom.nice.controller
. Вот почему вы получаете 404, потому что приложение не нашло контроллер вapplication
пакета.
разработчики SpringBoot рекомендуют размещать ваш основной класс приложения в корневом пакете выше других классов. Использование корневого пакета также позволяет использовать аннотацию @ComponentScan без необходимости указывать basePackage. подробная информация Но убедитесь, что пользовательский корневой пакет существует.
У меня была эта проблема, и то, что вам нужно сделать, это исправить ваши пакеты. Если вы скачали этот проект из http://start.spring.io/ тогда у вас есть ваш основной класс в каком-то пакете. Например, если пакет для основного класса: "com.пример" тогда и ваш контроллер должен быть в пакете: "ком.образец.контроллер." Надеюсь, это поможет.
есть 2 способа преодолеть это
метод 1) Поместите загрузочное приложение в начале структуры пакета и отдохните весь контроллер внутри него Образец : пакет com.весна.сапог.приложение; - вы загружаете приложение (т. е. основной метод-SpringApplication.выполнения(приложение.класс, аргументы);)
вы отдыхаете контроллер с той же структурой пакета Образец : пакет com.весна.сапог.приложение.отдых;
Метод 2) явно определить контроллер в загрузке пакет.
метод 1 чище.
надеюсь, что это поможет.
вам нужно изменить класс Starter-Application, как показано ниже.
@SpringBootApplication @EnableAutoConfiguration @ComponentScan(basePackages="com.nice.application") @EnableJpaRepositories("com.spring.app.repository") public class InventoryApp extends SpringBootServletInitializer {..........
и обновите структуру пакетов контроллера, сервиса и репозитория, как я уже упоминал ниже.
пример: REST-контроллер
package com.nice.controller;
--> Он должен быть изменен какpackage com.nice.application.controller;
вам нужно следовать правильной структуре пакета для всех пакетов, которые находятся в потоке Spring Boot MVC.
Итак, если вы измените пакет пакета проекта структуры правильно, то ваше приложение spring boot будет работать правильно.
тот же ответ 404 я получил после службы, выполненной с приведенным ниже кодом
@Controller @RequestMapping("/duecreate/v1.0") public class DueCreateController { }
ответ:
{ "timestamp": 1529692263422, "status": 404, "error": "Not Found", "message": "No message available", "path": "/duecreate/v1.0/status" }
после изменения его на ниже код я получил правильный ответ
@RestController @RequestMapping("/duecreate/v1.0") public class DueCreateController { }
ответ:
{ "batchId": "DUE1529673844630", "batchType": null, "executionDate": null, "status": "OPEN" }
заменить
@RequestMapping( "/item" )
с@GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE)
.может быть, это поможет кому-то.