こんにちは。たいら(@tairaengineer2)です。
転職を繰り返し現在4社経験している、10年目エンジニアです。
この記事では、 SpringBootでリクエストパラメータを取得できるようにする@RequestParamアノテーションについて
- @RequestParamアノテーションとは
- @RequestParamアノテーションを使ったサンプルプログラム
と、丁寧に解説していきます。
前提:実施している環境
この記事では、以下の環境で行っています。
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」という名前のプロジェクトを作っています。
@RequestParamアノテーションとは
@RequestParamアノテーションとは、リクエストパラメータを定義して取得できるようにするアノテーションです。
@RequestParamアノテーションを使うためには
1 |
import org.springframework.web.bind.annotation.RequestParam; |
をインポートする必要があります。
@RequestParamアノテーションの使い方サンプルは以下になります。
1 2 3 4 |
@RequestMapping(value = "/sample", method = RequestMethod.GET) String sample(@RequestParam(name = "test", value = "test", defaultValue = "テスト", required = false)String test) { // 処理 } |
このサンプルでは、【http://localhost:8080/sample?test=Java】でGETリクエストを投げた場合、sampleメソッドの引数testには「Java」という値が設定されます。
@RequestMappingアノテーションは、リクエストをマッピングするアノテーションです。
詳しくはこちらの記事をご参考ください。
@RequestParamアノテーションで指定できる属性の
- name属性、value属性
- required属性
- defaultValue属性
について、それぞれ詳しく解説します。
※name属性、value属性は同じ機能を持っているので一緒に解説します。
@RequestParamアノテーションの属性:name属性、value属性
@RequestParamアノテーションの属性のname属性とvalue属性は、リクエストパラメータを指定する属性です。
どちらも使っても同じ効果を得ることができます。
片方だけを使っても良いですし、両方使っても問題ありません。
1 2 3 4 |
@RequestMapping(value = "/sample", method = RequestMethod.GET) String sample(@RequestParam(name = "test", value = "test")String test) { // 処理 } |
だと「test」というリクエストパラメータに紐づく値をsampleメソッドの引数testに設定します。
name属性、value属性両方を使う場合に注意点があります。
それは、設定する値は必ず同じものを使う必要がある、という点です。
たとえば
1 2 3 4 |
@RequestMapping(value = "/sample", method = RequestMethod.GET) String sample(@RequestParam(name = "test", value = "sample")String test) { // 処理 } |
だとコンパイルは通るものの実行した場合
1 |
org.springframework.core.annotation.AnnotationConfigurationException |
という例外が発生します。
@RequestParamアノテーションの属性:required属性
@RequestParamアノテーションの属性のrequired属性は、そのリクエストパラメータは必須かどうかを指定する属性です。
trueならば必須、falseならば必須ではありません。
デフォルトはtrueです。
使い方サンプルの
1 2 3 4 |
@RequestMapping(value = "/sample", method = RequestMethod.GET) String sample(@RequestParam(name = "test", value = "test", defaultValue = "テスト", required = false)String test) { // 処理 } |
required属性はfalseなのでこの場合
- http://localhost:8080/sample
- http://localhost:8080/sample?test=Java
どちらも正常に実行することができます。
@RequestParamアノテーションの属性:defaultValue属性
@RequestParamアノテーションの属性のdefaultValue属性は、リクエストパラメーターが指定されていない、または空の場合に設定されるデフォルト値を指定する属性です。
もしdefaultValue属性を指定している場合、required属性にtrueを設定していてもfalseとなります。
使い方サンプルの
1 2 3 4 |
@RequestMapping(value = "/sample", method = RequestMethod.GET) String sample(@RequestParam(name = "test", value = "test", defaultValue = "テスト", required = false)String test) { // 処理 } |
は【http://localhost:8080/sample】とリクエストパラメータを設定しなかった場合、sampleメソッドの引数testには「テスト」が設定されます。
では、次の章で実際に使ってみます。
@RequestParamアノテーションを解説するプログラムの概要
@RequestParamアノテーションを解説するプログラムでは、
- 全属性を指定
- name属性のみを指定
という引数を持つメソッドを1つ作成します。
- 指定したリクエストパラメータを取得できていること
- 全属性を指定を指定したリクエストパラメータを設定しなかった場合defaultValue属性に指定した値が設定されていること
- name属性のみを指定したリクエストパラメータを設定しなかった場合エラーとなること
を確認します。
解説で使う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 21 22 23 |
package com.example.SpringSample; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class SpringSampleApplication { public static void main(String[] args) { SpringApplication.run(SpringSampleApplication.class, args); } @GetMapping(value = "/hello") String index( @RequestParam(name = "name", value = "name", defaultValue = "no name", required = false)String name, @RequestParam(name = "id")String id){ return "ID:" + id + " NAME:" + name; } } |
実行結果
プロジェクトを実行するやり方は
- プログラムを右クリックして実行
- 実行タブから実行
- ガターから実行
の3種類あるので、いずれかで実行します。
詳しい解説は以下の記事をご参考ください。
今回、確認するにあたりPostmanというツールを使います。
Postmanの基本的な使い方については、こちらの記事をご参考ください。
まず、「指定したリクエストパラメータを取得できていること」を確認します。
【http://localhost:8080/hello?name=Mike&id=123】のURL、かつGETでリクエストを投げると、HTTPステータスが正常の200、
ID:123 NAME:Mike
が返されているので、リクエストパラメータを取得できていることが確認できました。
次に、「全属性を指定を指定したリクエストパラメータを設定しなかった場合defaultValue属性に指定した値が設定されていること」を確認します。
【http://localhost:8080/hello?id=123】のURL、かつGETでリクエストを投げると、HTTPステータスが正常の200、
ID:123 NAME:no name
が返されているのでリクエストパラメータを設定しなかった場合、defaultValue属性に指定した値が設定されていることが確認できました。
最期に、「name属性のみを指定したリクエストパラメータを設定しなかった場合エラーとなること」を確認します。
【http://localhost:8080/hello?name=Mike】のURL、かつGETでリクエストを投げると、HTTPステータスが400で、
1 2 3 4 5 6 7 8 |
{ "timestamp": "2022-03-23T14:26:03.715+00:00", "status": 400, "error": "Bad Request", "trace": "org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'id' for method parameter type String is not present\r\n\tat org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueInternal(RequestParamMethodArgumentResolver.java:218)\r\n\tat org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:193)\r\n\tat org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114)\r\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\r\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\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": "Required request parameter 'id' for method parameter type String is not present", "path": "/hello" } |
と、「id」リクエストパラメータが存在しないというとエラーが返ってきているので、required属性がtrueであった場合エラーとなることが確認できました。
まとめ:@RequestParamアノテーションを使ってみよう!
以上がSpringBootのリクエストパラメータを取得できるようにする@RequestParamアノテーションについての解説でした!
あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ
コメント