こんにちは。たいら(@tairaengineer2)です。
転職を繰り返し現在4社経験している、10年目エンジニアです。
この記事では、 SpringBootでPOSTリクエストをマッピングできる@PostMappingアノテーションについて
- @PostMappingアノテーションとは
- @PostMappingアノテーションを使ったサンプルプログラム
と、丁寧に解説していきます。
前提:実施している環境
この記事では、以下の環境で行っています。
OS | Windows10 |
---|---|
IntelliJ IDEAのエディション | Community(無料版) |
IntelliJ IDEAのバージョン | 2021.3.2 |
プロジェクト | Gradle Project |
言語 | Java バージョン11 |
フレームワーク | Spring Boot バージョン2.6.3 |
Spring Bootを動かすためにIntelliJ IDEAを使っています。
IntelliJ IDEAのインストールとSpring Bootプロジェクトを新規作成するやり方はこちらの記事をご参考ください。
【IntelliJ IDEA】インストールするやり方を解説します(Windows向け)
Spring Bootプロジェクトを新規作成するやり方
【IntelliJ IDEA】Spring Initializrを使ってSpring Bootプロジェクトを新規作成するやり方を解説します
この記事では
C:\SpringBootSample
配下に「SpringSample」という名前のプロジェクトを作っています。
@PostMappingアノテーションとは
@PostMappingアノテーションとは、POSTリクエストのみをURLとコントローラーのクラスまたはメソッドを紐づけることができるアノテーションです。
要は@PostMappingアノテーションは、@RequestMappingアノテーションのPOSTリクエスト用のアノテーションです。
@RequestMappingアノテーションについては、こちらの記事をご参考ください。
@PostMappingアノテーションを使うためには
1 |
import org.springframework.web.bind.annotation.PostMapping; |
をインポートする必要があります。
@PostMappingアノテーションの使い方サンプルは以下になります。
1 2 3 4 |
@PostMapping(value = "/sample") String sample(){ // 処理 } |
value属性は、メソッドやクラスに紐づけるURLのパスを指定する属性です。
1 2 3 4 |
@PostMapping(value = "/sample") String sample(){ // 処理 } |
だとPOSTリクエストの【http://localhost:8080/sample】というURLとsampleメソッドを紐づける、という意味です。
最初の「/」は省略してもOKです。
属性名の「value」は
1 2 3 4 |
@PostMapping("/sample") String sample(){ // 処理 } |
と、省略してもOKです。
また、value属性には複数のURLのパスを指定することもできます。
書き方は
1 2 3 4 |
@PostMapping({"/test", "/sample"}) String sample(){ // 処理 } |
です。
この場合POSTリクエストの
- http://localhost:8080/sample
- http://localhost:8080/test
のURLのパスとsampleメソッドを紐づけています。
@RequestMappingアノテーションだとあったmethod属性は、@PostMappingアノテーションにはありません。
では、次の章で実際に使ってみます。
@PostMappingアノテーションを解説するプログラムの概要
@PostMappingアノテーションを解説するプログラムでは、
value属性にURLのパスを2つ指定したメソッドを1つ作成します。
- value属性に指定したURLのパス2つともでアクセスできること
- GETでアクセスできないこと
を確認します。
解説で使うJavaプログラムは、
SpringSample\src\main\java\com\example\SpringSample
配下にある【SpringSampleApplication.java】を使います。
Javaサンプルプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.example.SpringSample; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class SpringSampleApplication { public static void main(String[] args) { SpringApplication.run(SpringSampleApplication.class, args); } @PostMapping(value = {"/hello", "/world"}) String index(){ return "Hello World!"; } } |
実行結果
プロジェクトを実行するやり方は
- プログラムを右クリックして実行
- 実行タブから実行
- ガターから実行
の3種類あるので、いずれかで実行します。
詳しい解説は以下の記事をご参考ください。
今回、確認するにあたりPostmanというツールを使います。
Postmanの基本的な使い方については、こちらの記事をご参考ください。
まず、「value属性に指定したURLのパス2つともでアクセスできること」を確認します。
【http://localhost:8080/hello】のURL、かつPOSTでリクエストを投げると、HTTPステータスが正常の200、
Hello World!
が返されているので、アクセスできていることが確認できました。
【http://localhost:8080/world】のURL、かつPOSTでリクエストを投げると、こちらもHTTPステータスが200で
Hello World!
と同じレスポンスが返ってきているので、アクセスできていることが確認できました。
指定したものとは異なる【http://localhost:8080/aaa】のURL、かつPOSTでリクエストを投げると、HTTPステータスが404で
1 2 3 4 5 6 7 |
{ "timestamp": "2022-03-15T08:46:47.329+00:00", "status": 404, "error": "Not Found", "message": "No message available", "path": "/aaa" } |
と、このURLは存在しないとエラーが返ってきているので、アノテーションで指定していないURLにはアクセスできていないことが確認できました。
2つ目の「GETでアクセスできないこと」を確認します。
【http://localhost:8080/hello】のURL、かつGETでリクエストを投げると、HTTPステータスが405で、
1 2 3 4 5 6 7 8 |
{ "timestamp": "2022-03-15T08:48:46.890+00:00", "status": 405, "error": "Method Not Allowed", "trace": "org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:253)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:442)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:383)\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:125)\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:67)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:498)\r\n\tat org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1261)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1043)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:655)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:833)\r\n", "message": "Request method 'GET' not supported", "path": "/hello" } |
と、【HttpRequestMethodNotSupportedException】という特定のリクエストメソッドをサポートしていない場合にスローされる例外が返ってきています。
@PostMappingアノテーションだと、GETではアクセスすることができないことが確認できました。
まとめ:@PostMappingアノテーションを使ってみよう!
以上がSpringBootのPOSTリクエストのURLとクラスやメソッドをマッピングする@PostMappingアノテーションについての解説でした!
@PostMappingアノテーションと対をなす、GETリクエストを受け付ける@GetMappingアノテーションというものもあります。
詳しくはこちらの記事をご参考ください。
あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ
コメント