
はじめに
こんにちは、新卒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の使い方を紹介しました。誰かの参考になれば幸いです。
最後に、エキサイトではデザイナー、フロントエンジニア、バックエンドエンジニア、アプリエンジニアを絶賛募集しております!
興味があればぜひ連絡よろしくお願いいたします。