はじめに
こんにちは、新卒2年目の岡崎です。今回は@ModelAttribute
の使い方を紹介します。
環境
- Gradleのバージョン
------------------------------------------------------------ Gradle 8.11.1 ------------------------------------------------------------ Build time: 2024-11-20 16:56:46 UTC Revision: 481cb05a490e0ef9f8620f7873b83bd8a72e7c39 Kotlin: 2.0.20 Groovy: 3.0.22 Ant: Apache Ant(TM) version 1.10.14 compiled on August 16 2023 Launcher JVM: 21.0.5 (Amazon.com Inc. 21.0.5+11-LTS) OS: Mac OS X 14.7.2 aarch64
- Javaのバージョン
openjdk version "21.0.5" 2024-10-15 LTS OpenJDK Runtime Environment Corretto-21.0.5.11.1 (build 21.0.5+11-LTS) OpenJDK 64-Bit Server VM Corretto-21.0.5.11.1 (build 21.0.5+11-LTS, mixed mode, sharing)
- Spring Bootのバージョン
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.3.0)
準備
gradleに以下の依存関係を追加してください。
implementation 'org.springframework.boot:spring-boot-starter-web'
@ModelAttribute
について
@ModelAttribute
は、リクエストパラメータをオブジェクトに変換し、Controllerの引数として受け取れるアノテーションです。
@ModelAttribute
を引数につける
@ModelAttribute
を引数につけると、リクエストパラメータが自動的にオブジェクトにマッピングされます。
例えば、userId
とuserName
をリクエストパラメータとして受け取り、画面に表示するエンドポイントを作成してみます。
@RestController public class TestController { private final static String TEST_FORMAT = "userId: {userId}, userName: {userName}"; @GetMapping("test/user") public String getTest( @ModelAttribute GetUserRequestModel requestModel ) { return TEST_FORMAT .replace("{userId}", requestModel.getUserId()) .replace("{userName}", requestModel.getUserName()); } @Data private static class GetUserRequestModel { private String userId; private String userName; } }
http://localhost:ポート番号/test/user?userId=123&userName=太郎
にアクセスすると、userId
とuserName
が画面に表示されました。
@ModelAttribute
を使うことで、複数のリクエストパラメータをまとめてオブジェクトとして扱えます。これにより、コードの可読性が上がることが期待できます。
@ModelAttribute
をメソッドにつける
@ModelAttribute
は、メソッドにつけることもできます。
@ModelAttribute
をメソッドにつけると、Controllerにあるエンドポイントが実行される前に、そのメソッドの処理が適用されます。
例えば、userName
が admin
でない場合にエラーを返すようなバリデーションを実装します。
@RestController public class SampleController { @ModelAttribute public void Valid(String userName) { if (StringUtils.isBlank(userName)) { throw new BadRequestException("userNameが存在しません"); } } @GetMapping("userName/exist") public String getUserName() { return "user name is exist."; } }
http://localhost:ポート番号/userName/exist
にアクセスすると、userName
がないため、Bad Request
になりました。
BadRequestException: userNameが存在しません
http://localhost:ポート番号/userName/exist?userName=sample
にアクセスすると、以下の画面が表示されました。
このように、@ModelAttribute
をメソッドの前につけることにより、バリデーション処理などを共通化し、コードを簡潔に整理できます。
最後に
今回は@ModelAttribute
の使い方を紹介しました。誰かの参考になれば幸いです。
最後に、エキサイトではデザイナー、フロントエンジニア、バックエンドエンジニア、アプリエンジニアを絶賛募集しております!
興味があればぜひ連絡よろしくお願いいたします。