Spring BootのWebサイトでREST Controllerの例を修正しようとしています。 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>
スターターアプリケーション:
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
これまでに試したこと
@RequestMapping("/")
をItemInventoryController
のクラスレベルに置く私が理解している限りでは、Spring Bootを使用するときはアプリケーションコンテキストは必要ありません。私は正しいですか?
URL経由でメソッドにアクセスするには他に何ができますか?
以下をInventoryAppクラスに追加してみてください
@SpringBootApplication
@ComponentScan(basePackageClasses = ItemInventoryController.class)
public class InventoryApp {
...
spring-bootはcom.Nice.application
以下のパッケージ内のコンポーネントをスキャンするので、あなたのコントローラがcom.Nice.controller
にある場合は明示的にスキャンする必要があります。
MattRの答えに追加する:
ここ にあるように、@SpringBootApplication
は必要な注釈を自動的に挿入します。@Configuration
、@EnableAutoConfiguration
、そして@ComponentScan
。ただし、@ComponentScan
はAppと同じパッケージ内のコンポーネント、この場合はcom.Nice.application
のみを検索しますが、コントローラはcom.Nice.controller
内にあります。アプリがapplication
パッケージでコントローラを見つけられなかったため、404が表示されるのはそのためです。
SpringBoot開発者は、あなたのメインアプリケーションクラスを他のクラスの上のルートパッケージに置くことを勧めます。ルートパッケージを使用すると、basePackage属性を指定しなくても@ComponentScanアノテーションを使用することもできます。 詳細情報 しかし、カスタムルートパッケージが存在することを確認してください。
以下のコードでサービス実行後に取得したものと同じ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"
}
私はこの問題を抱えていて、あなたがする必要があるのはあなたのパッケージを修正することです。このプロジェクトを http://start.spring.io/ からダウンロードした場合は、メインクラスがいくつかのパッケージに含まれています。たとえば、メインクラスのパッケージが "com.example"の場合、コントローラは "com.example.controller"パッケージ内にある必要があります。お役に立てれば。
これを克服する2つの方法があります
方法1)起動アプリケーションをパッケージ構造の先頭に置き、その中にあるすべてのコントローラを停止します。例:package com.spring.boot.app; - あなたはアプリケーションを起動します(すなわち、メインメソッド-SpringApplication.run(App.class、args);)
同じパッケージ構造を使用してControllerを休止します。例:package com.spring.boot.app.rest;
方法2)BootupパッケージでControllerを明示的に定義します。
方法1はよりクリーンです。
これが役立つことを願っています。
以下に示すようにStarter-Applicationクラスを変更する必要があります。
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages="com.Nice.application")
@EnableJpaRepositories("com.spring.app.repository")
public class InventoryApp extends SpringBootServletInitializer {..........
そして、以下に述べるように、Controller、Service、およびRepositoryのパッケージ構造を更新します。
例:RESTコントローラ
package com.Nice.controller;
- >次のように修正する必要がありますpackage com.Nice.application.controller;
Spring Boot MVCフローに含まれるすべてのパッケージに対して適切なパッケージ構造に従う必要があります。
そのため、プロジェクトバンドルのパッケージ構造を正しく修正すれば、Spring Bootのアプリは正しく動作するでしょう。
私はまったく同じエラーがありました、私はベースパッケージを与えていませんでした。正しい基本パッケージを与えて、それを解決しました。
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を指定してもスキャンされないため、.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";
};
}
時々春のブーツは奇妙に振る舞います。アプリケーションクラスで以下を指定しましたが、動作します。
@ComponentScan("com.seic.deliveryautomation.controller")
@RequestMapping( "/item" )
を@GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE)
に置き換えます。
多分それは誰かを助けるでしょう。
rl Case Sensitivityのため、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時間かかりました。だから、それが誰かを助けることを願っています。