Spring Boot:localhost(404)のRESTコントローラーにアクセスできない


104

Spring BootのWebサイトでRESTコントローラーの例を採用しようとしています。残念ながら、localhost:8080/itemURL にアクセスしようとすると、次のエラーが発生します。

{
  "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 its 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

これまでに試したこと:

  • アプリケーション名(InventoryApp)でURLにアクセスする
  • @RequestMapping("/")クラスレベルで別のItemInventoryController

私が理解している限り、Spring Bootを使用するときにアプリケーションコンテキストは必要ありません。私は正しいですか?

URL経由でメソッドにアクセスするには、他に何ができますか?


アプリケーションをどのように実行していますか?ログを含めることができますか?
wjans 2015

Eclipseとmvn spring-boot:run(jarとして)を使用して個別に試してみました。上記のログ(編集済み)を参照してください
mchlfchr 2015

起動ログからは、コントローラーを見つけているようには見えません。コントローラークラスはどのパッケージにありますか?
MattR 2015

1
別のパッケージにあります。mainメソッドを含むスタータークラスは「アプリケーション」にあり、コントローラーはパッケージ「コントローラー」にあります。このように構成された例(spring.ioの例ではありません)を見てきました。
mchlfchr 2015

4
デフォルトでは、spring-bootは同じパッケージ内のコンポーネント、またはアプリケーションクラスと「下」(同じプレフィックス)のパッケージをスキャンします。そうでない場合は、明示的にスキャンする必要があります。たとえば、@ ComponentScanを使用する
MattR

回答:


196

以下をInventoryAppクラスに追加してみてください

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

spring-bootは以下のパッケージ内のコンポーネントをスキャンするためcom.nice.application、コントローラーが含まれているcom.nice.controller場合は、明示的にスキャンする必要があります。


同じ問題があります。私はcomponentscan何もしてみてください:-(ハイアー私の質問:stackoverflow.com/questions/33000931/...
emoleumassi

1
@SpringBootApplication含まれていることに注意してください@Configuration
krzakov '12

9
アプリケーションを「ルート」パッケージ(「org.whatever」など)に配置し、コントローラー、サービスをサブパッケージに配置するのが最も簡単なようです。
insan-e 2017

7
私は同じ問題を抱えていますが、この解決策に進む前に、私はそれを見つけました...さらに。スプリングブートアプリケーションクラス(メインメソッドが定義されている)をコントローラーパッケージの1レベル上に移動します。コントローラーはこれから見えるようになり、機能します
Tayab Hussain

1
「@ComponentScan(basePackages = "com.nice.controller")」を使用することもできます。コンポーネントのデフォルトスキャンはパスで開始されます。パスはAppクラスで、サブパッケージもスキャンします。その場合、@ ComponentScanアノテーションを使用する必要はありません。自動的に行われます。複数のコントローラーがある場合、それらを異なるパッケージに含めることも可能です。それらをチェーンすることができます。その場合、衝突を避けることが重要です。
hariprasad

46

MattRの回答への追加:ここで説明した

ように、必要な注釈を自動的に挿入します。@SpringBootApplication@Configuration@EnableAutoConfigurationし、また@ComponentScan、ただし、は@ComponentScanアプリと同じパッケージ内のコンポーネントのみを検索しますcom.nice.application。この場合は、コントローラーはにありcom.nice.controllerます。アプリがapplicationパッケージ内にコントローラーを見つけられなかったため、404が表示されるのはこのためです。


5
これが上記の説明からまだ完全に明確でない場合、@ SpringBootApplicationアノテーションが付いたクラスは、検索したいものと同じか、ディレクトリ構造内の同じレベルにある必要があります。たとえば、com.app.configurationとcom.app.controllersがありました。Applicationクラスを誤ってcom.app.configurationに配置しましたが、com.app.configuration内の他のすべては正常に機能しましたが、com.app.controllers内の何も読み込まれていませんでした。Applicationクラスをcom.appに移動したところ、他の場所にあるBeanが見つかり、問題が発生し始めました。私にとって新人の間違い。
glaukommatos 2017年

2
@ComponentScan(basePackages = "com.base.package")を追加すると、私の場合それを解決しました
Shamli

これは本当に役立ちます。
マドゥトミー

12

SpringBootの開発者は、メインアプリケーションクラスを他のクラスの上にあるルートパッケージに配置することをお勧めします。ルートパッケージを使用すると、basePackage属性を指定せずに@ComponentScanアノテーションを使用することもできます。 詳細情報 ただし、カスタムルートパッケージが存在することを確認してください


10

以下のコードでサービスが実行された後に取得したものと同じ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"
}

1
他の読者がそれを見ない場合 @Controller->@RestController
Janac Meena

7

私にはこの問題があり、あなたがする必要があるのはあなたのパッケージを修正することです。このプロジェクトをhttp://start.spring.io/からダウンロードした場合、メインクラスがいくつかのパッケージに含まれています。たとえば、メインクラスのパッケージが "com.example"の場合、コントローラーはパッケージに含まれている必要があります: "com.example.controller"。お役に立てれば。


6

これを克服する2つの方法があります

  1. ブートアップアプリケーションをパッケージ構造の先頭に配置し、その中にすべてのコントローラーを置きます。

    例:

    パッケージcom.spring.boot.app; -アプリケーションを起動します(つまり、Mainメソッド-SpringApplication.run(App.class、args);)

    コントローラーを同じパッケージ構造でレストします。例:パッケージcom.spring.boot.app.rest;

  2. 起動パッケージでコントローラーを明示的に定義します。

方法1の方がクリーンです。


1
スプリングブートは、アプリケーションクラスが基本パッケージ以外のパッケージの下にあることを嫌います。基本パッケージがorg.someappであり、それをorg.someapp.appの下に置くと、爆破されます。:-/
Priyank Thakkar

3

以下に示すように、Starter-Applicationクラスを変更する必要があります。

@SpringBootApplication

@EnableAutoConfiguration

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

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

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

そして、以下に述べたように、コントローラー、サービス、リポジトリのパッケージ構造を更新します。

例:REST-Controller

package com.nice.controller; ->変更する必要があります
package com.nice.application.controller;

Spring Boot MVCフローにあるすべてのパッケージについて、適切なパッケージ構造に従う必要があります。

したがって、プロジェクトバンドルのパッケージ構造を正しく変更すると、Spring Bootアプリは正しく動作します。


3
EnableAutoConfigurationは@SpringBootApplicationに含まれているため、追加しても意味がありません。
ソフィアン2017

1

交換する@RequestMapping( "/item" )@GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE)

多分それは誰かを助けるでしょう。


1
それは私がのname代わりに書いたことを認識するのに役立ちましvalue@GetMapping
vortex.alex

0

私はまったく同じエラーがありました、私はベースパッケージを与えていませんでした。正しい基本パッケージを与え、それを解決しました。

package com.ymc.backend.ymcbe;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages="com.ymc.backend")
public class YmcbeApplication {

    public static void main(String[] args) {
        SpringApplication.run(YmcbeApplication.class, args);
    }

}

注:.controller @ComponentScan(basePackages = "com.ymc.backend.controller")は含めない

これが私のコントローラーのサンプルです:

package com.ymc.backend.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@CrossOrigin
@RequestMapping(value = "/user")
public class UserController {

    @PostMapping("/sendOTP")
    public String sendOTP() {
        return "OTP sent";
    };


}

0

時々、春のブーツは奇妙に振る舞います。私はアプリケーションクラスで以下を指定し、それは動作します:

@ComponentScan("com.seic.deliveryautomation.controller")

0

URLの大文字と小文字の区別が原因で404の問題が発生しました。

たとえば、 @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時間かかりました。だから私はそれが誰かを助けることを願っています。


0

私にとっては、pom.xmlにspring-boot-starter-webではなくspring-webを追加していました

spring-webからspring-boot-starter-webに置き換えると、すべてのマッピングがコンソールログに表示されます。


0

次のように使用しても機能します。

@SpringBootApplication(scanBasePackages = { "<class ItemInventoryController package >.*" })

0

他にポート8080で何かが実行されていて、実際に間違ってポート8080に接続している可能性があります。

特に、自分が制御していない他のサービスを起動するドッカーがあり、それらのサービスをポート転送している場合は、必ず確認してください。


0

問題はパッケージの構造にあります。Spring Boot Applicationには、Springコンテキストがそのコンテキスト内のさまざまなBeanをスキャンしてロードできるようにする特定のパッケージ構造があります。

com.nice.applicationにはメインクラスがあり、com.nice.controllerにはコントローラークラスがあります。

SpringがBeanにアクセスできるように、com.nice.controllerパッケージをcom.nice.applicationに移動します。


-1

POM内に追加できます。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <version>XXXXXXXXX</version>
</dependency>

-2

springbootapplicationクラスをルートパッケージに配置します。たとえば、サービス、コントローラーがspringBoot.xyzパッケージにある場合、メインクラスはspringBootパッケージにある必要があります。そうでない場合、以下のパッケージはスキャンされません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.