[Spring Boot] @ModelAttributeの使い方 [Java]

はじめに

こんにちは、新卒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を引数につけると、リクエストパラメータが自動的にオブジェクトにマッピングされます。

例えば、userIduserNameをリクエストパラメータとして受け取り、画面に表示するエンドポイントを作成してみます。

@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=太郎にアクセスすると、userIduserNameが画面に表示されました。

@ModelAttributeを使うことで、複数のリクエストパラメータをまとめてオブジェクトとして扱えます。これにより、コードの可読性が上がることが期待できます。

@ModelAttributeをメソッドにつける

@ModelAttributeは、メソッドにつけることもできます。 @ModelAttributeをメソッドにつけると、Controllerにあるエンドポイントが実行される前に、そのメソッドの処理が適用されます。

例えば、userNameadminでない場合にエラーを返すようなバリデーションを実装します。

@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の使い方を紹介しました。誰かの参考になれば幸いです。

最後に、エキサイトではデザイナー、フロントエンジニア、バックエンドエンジニア、アプリエンジニアを絶賛募集しております!

興味があればぜひ連絡よろしくお願いいたします。

www.wantedly.com