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 54

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).

может быть, это поможет кому-то.

поместите класс springbootapplication в корневой пакет, например,если ваш сервис, контроллер находится в springBoot.xyz пакет, то ваш основной класс должен быть в springBoot пакет в противном случае он не будет сканировать ниже пакетов

Ваш URL должен быть, вам не хватает контекста приложения: localhost: 8080 / SpringBootTest / item