カテゴリ: Spring 更新日: 2026/09/26

JavaのSpringで使う@NotNullアノテーションを完全解説!初心者でも理解できる入力チェックの基本

Springの@NotNullアノテーション
Springの@NotNullアノテーション

先生と生徒の会話形式で理解しよう

生徒

「Springのバリデーションで@NotNullというアノテーションをよく見かけるんですが、これは何のために使うんですか?」

先生

「@NotNullアノテーションは、その値が必ず存在していなければならないというルールをつけるものです。入力チェックやAPIのリクエスト検証にとてもよく使われていますよ。」

生徒

「具体的にどんな場面で使うことが多いんでしょうか?」

先生

「例えばユーザー登録で名前を必ず入力させたいときなどです。名前がnullだったら困りますよね。そういうときに@NotNullをつけて検証します。」

1. @NotNullアノテーションとは何か

1. @NotNullアノテーションとは何か
1. @NotNullアノテーションとは何か

@NotNullアノテーションは、Javaのシステム開発で広く使われているBean Validation(Jakarta Bean Validation)という仕様に基づいた制約ルールの一つです。Spring BootなどのフレームワークでWebアプリを作る際、画面からの入力値や外部システムから送られてくるデータが「空っぽ(null)」ではないことを保証するために使用します。

プログラミング未経験の方へ:null(ヌル)とは?

プログラミングの世界では、箱の中に何も入っていない状態を「null」と呼びます。例えば、名前を入力する欄に何も書かずに送信ボタンを押すと、プログラム内部では名前がnullとして扱われます。

もし@NotNullを指定した項目にデータが入っていなかった場合、プログラムは自動的に「ルール違反」を検知してエラーを発生させます。これにより、開発者が一つずつ「データが入っているかな?」とチェックするコードを書く手間が省け、ソースコードが非常にスッキリと読みやすくなります。

例えば、お買い物サイトの会員登録をイメージしてみましょう。以下のようなプログラムの書き方で、必須項目を定義します。


import jakarta.validation.constraints.NotNull;

public class MemberRegistration {

    // ユーザー名は絶対に空っぽ(null)ではいけない
    @NotNull
    private String userName;

    // 必須ではない項目にはアノテーションを付けない
    private String nickname;
}

このように記述することで、userNameが空の状態でデータが送られてきたときに、システムが自動でエラーとして弾いてくれるようになります。データの整合性を保ち、システムの不具合を未然に防ぐための非常に重要な役割を担っています。

2. 基本的な使い方

2. 基本的な使い方
2. 基本的な使い方

Spring Bootで@NotNullを活用する方法は非常にシンプルです。バリデーション(入力チェック)を行いたいクラスのフィールドに対して、アノテーションを付与するだけで準備が整います。まずは、具体的なプログラムの記述例を見てみましょう。


import jakarta.validation.constraints.NotNull;

public class UserRequest {

    // このフィールドはnull(空っぽ)を許可しません
    @NotNull
    private String name;

    // このフィールドはnullでも許容されます
    private Integer age;

    // 以下にgetterとsetterが続きます
}

このコードでは、nameという項目に@NotNullを指定しています。これにより、システムがデータを受け取る際、nameの中身が「null(値が存在しない状態)」になっていないかを自動的に監視します。もしnameが空の状態でデータが送られてくると、Spring Bootが即座にエラーとして検知し、後続の処理(データベースへの保存など)をストップさせてくれます。

ここがポイント!

初心者の方が間違いやすい点として、@NotNullは「値が設定されていること」だけをチェックします。たとえば、文字列であれば「文字が1文字も入っていない空文字("")」は、nullではないためチェックを通過します。まずは「箱そのものが存在するかどうか」を確認するための第一歩として、このアノテーションを使いこなしましょう。

このように設定することで、開発者がわざわざ「if (name == null)」といったチェック用コードを何行も書く必要がなくなり、安全で読みやすいプログラムを実現できます。

3. 実行例とエラーメッセージ

3. 実行例とエラーメッセージ
3. 実行例とエラーメッセージ

実際に@NotNullがどのように動作するのか、Spring Bootのコントローラ(リクエストを受け取る窓口)での例を見てみましょう。ポイントは、引数に@Validというアノテーションを付けることです。これにより、Javaが自動的に中身をチェックしてくれます。


@RestController
public class UserController {

    @PostMapping("/users")
    public ResponseEntity<String> createUser(@Valid @RequestBody UserRequest request) {
        // @Validがあることで、メソッドが動く前に@NotNullのチェックが走ります
        return ResponseEntity.ok("ユーザー登録に成功しました!");
    }
}

例えば、このシステムに対して名前(name)をあえて空っぽにして、以下のようなデータ(JSON形式)を送ってみたとします。


{
    "name": null,
    "age": 25
}

すると、プログラムは「nameがnullなのでルール違反です!」と判断し、自動的に以下のようなエラー情報を返却します。これがバリデーションの仕組みです。


{
    "timestamp": "2026-02-12T12:00:00.000+00:00",
    "status": 400,
    "errors": [
        {
            "field": "name",
            "message": "must not be null"
        }
    ]
}

ここがすごい!

もしこのチェック機能がないと、名前が空のままデータベースに保存されてしまい、後でシステムがクラッシュする原因になります。@NotNullを使うだけで、こうした「あってはならないデータ」を入り口でシャットアウトできるのです。

このように、実行時に自動で「must not be null(nullであってはなりません)」というメッセージを返してくれるため、開発者はエラー時の処理を最小限に抑えることができます。

4. @NotNullと@NotEmpty、@NotBlankの違い

4. @NotNullと@NotEmpty、@NotBlankの違い
4. @NotNullと@NotEmpty、@NotBlankの違い

Javaのバリデーションを学んでいると、@NotNullの他にも「似ているけれど少し違う」アノテーションが出てきます。特に初心者が迷いやすいのが@NotEmptyと@NotBlankです。これらを適切に使い分けることが、バグの少ない堅牢なシステムを作る第一歩となります。

アノテーション nullの判定 空文字("")の判定 空白(" ")の判定
@NotNull NG(エラー) OK(通る) OK(通る)
@NotEmpty NG(エラー) NG(エラー) OK(通る)
@NotBlank NG(エラー) NG(エラー) NG(エラー)

これらがプログラム上でどのように判定されるのか、具体的なサンプルコードで確認してみましょう。


public class UserInput {

    // 1. nullさえ避ければOK(数値やオブジェクトに最適)
    @NotNull
    private Integer age;

    // 2. nullもダメ、文字数が0もダメ(リストや配列にも使えます)
    @NotEmpty
    private String hobby;

    // 3. nullも空白も一切禁止!最も厳しいチェック(名前や住所に最適)
    @NotBlank
    private String address;
}

使い分けのヒント

例えば、ユーザーが「名前」を入力する欄にスペース(空白)だけを入れて送信したとします。@NotNullや@NotEmptyではこの「空白」を有効なデータとして通してしまいますが、@NotBlankを使えば「実質的に何も書いていない」と判断してエラーにしてくれます。

一方で、数値(Integer)などの場合は文字列ではないため@NotBlankは使えません。その場合は@NotNullを使用します。このように、データの型や「どこまで厳しくチェックしたいか」によって使い分けるのがプロの技です。

まずは「基本は@NotNull、文字列の必須入力なら@NotBlank」と覚えておくだけでも、実務で十分に役立ちます。

5. 実務での活用例

5. 実務での活用例
5. 実務での活用例

@NotNullアノテーションは、実際のシステム開発において「データの門番」のような役割を果たします。特に、ユーザーから受け取ったデータがプログラムの深い場所(データベースなど)に到達する前に、不備を未然に防ぐために多用されます。

プログラミングに慣れていない方でもイメージしやすい、具体的な3つの活用シーンを見てみましょう。

  • Webサイトの会員登録:名前やメールアドレスなど、空欄だと登録後に連絡ができなくなる項目を必須にします。
  • ネットショップの注文:商品の数量や配送方法など、注文を確定させるために絶対に欠かせない情報を保証します。
  • アンケート回答:特定の質問に対して、必ず回答を選択してほしい場合に活用します。

例えば、ECサイトで「商品の購入個数」を管理するプログラムを考えてみましょう。個数がnull(設定されていない)のまま計算が進むと、システムがエラーで止まってしまいます。これを防ぐために、以下のように記述します。


public class OrderRequest {

    // 購入する商品のIDは必須
    @NotNull
    private Long productId;

    // 購入個数は必須(nullだと計算エラーになるため)
    @NotNull
    private Integer quantity;
}

このように設定するだけで、個数が入力されていない注文は自動的にエラーとして処理され、安全なデータだけが次の処理へと進むことができます。これは、単にエラーを防ぐだけでなく「システムが予期しない動作をすることを防ぐ」という、信頼性の高い設計において非常に重要な考え方です。

開発者が何十行ものチェック用プログラム(if文など)を自力で書く必要がなくなるため、コードの見通しが良くなり、修正や機能追加もスムーズに行えるようになります。

6. エラーメッセージのカスタマイズ

6. エラーメッセージのカスタマイズ
6. エラーメッセージのカスタマイズ

@NotNullでチェックを行った際、デフォルトでは「must not be null」という英語のメッセージが表示されます。しかし、日本向けのサービスであれば「名前を入力してください」のように、日本語で分かりやすく表示したいですよね。Spring Bootでは、このメッセージを自由に変更することができます。

プログラミング未経験の方へ:メッセージを分ける理由

プログラムの中に直接日本語を書くこともできますが、専用の「設定ファイル(プロパティファイル)」にメッセージをまとめておくことで、後から一括で修正したり、多言語対応(英語や中国語への切り替え)が非常に楽になります。

まずは、メッセージを定義する src/main/resources/ValidationMessages.properties というファイルを作成し、以下のようにエラー時の文章を記述します。


user.name.notnull=ユーザー名は必須入力です。空のままでは登録できません。
user.age.notnull=年齢を入力してください。

次に、Javaのプログラム側でそのメッセージを呼び出すように指定します。アノテーションのカッコ内に message = "{プロパティ名}" と記述するのがポイントです。


public class UserRequest {

    // 設定ファイルに書いた「user.name.notnull」の内容が表示されます
    @NotNull(message = "{user.name.notnull}")
    private String name;

    // もちろん、ここに直接文章を書くことも可能です
    @NotNull(message = "年齢の入力は必須です")
    private Integer age;
}

このように設定することで、入力漏れがあった際にユーザーへ親切な案内を出すことが可能になります。エラーメッセージを丁寧に作り込むことは、ユーザーが迷わず操作できる「使い勝手の良いシステム」にするための非常に重要なステップです。

7. グループバリデーションとの併用

7. グループバリデーションとの併用
7. グループバリデーションとの併用

実務では新規登録と更新でルールを変えたい場合があります。そのようなときはバリデーショングループを使います。


public class ValidationGroups {
    public interface Create {}
    public interface Update {}
}

public class UserRequest {

    @NotNull(groups = ValidationGroups.Update.class)
    private Long id;

    @NotNull(groups = {ValidationGroups.Create.class, ValidationGroups.Update.class})
    private String name;
}

これにより、更新処理ではidが必須、新規作成では不要といった柔軟なルールを適用できます。

8. Spring BootとHibernate Validatorの連携

8. Spring BootとHibernate Validatorの連携
8. Spring BootとHibernate Validatorの連携

@NotNullはHibernate Validatorの実装を通じて実際に検証されます。Spring Bootではこのライブラリが自動で組み込まれているため、特別な設定をしなくても使えます。

また、複雑な条件を組み合わせたい場合は、@NotNullと他のアノテーションを同時に使ったり、独自のバリデーションアノテーションを定義することも可能です。

9. API設計における@NotNullの役割

9. API設計における@NotNullの役割
9. API設計における@NotNullの役割

REST APIの入力チェックでは@NotNullが特に重要です。フロントエンドや外部システムからのリクエストに必須項目が抜け落ちていないかを自動でチェックできるため、セキュリティ面やデータ整合性の観点でも有効です。

また、OpenAPI仕様書やSwaggerを利用する場合も@NotNullの情報は必須項目として自動反映されるため、ドキュメントの品質も向上します。

まとめ

まとめ
まとめ

この記事全体の振り返り

ここまで、JavaのSpringでよく使われる@NotNullアノテーションについて、基礎から実務での使い方までを順番に確認してきました。@NotNullは、入力値が必ず存在していなければならないことを保証するための非常に基本的で重要なバリデーションアノテーションです。Spring BootやSpring MVCを使ったWebアプリケーション開発では、フォーム入力やREST APIのリクエストを安全に受け取るために欠かせない存在と言えます。

@NotNullを使うことで、値がnullかどうかを毎回if文で確認する必要がなくなり、コードは読みやすく、保守しやすくなります。また、バリデーションエラーが発生した場合も、SpringとHibernate Validatorが自動的にエラー情報を生成してくれるため、入力チェックの実装にかかる手間を大きく減らせます。これは、初心者にとっても理解しやすく、実務でもすぐに役立つポイントです。

記事の中では、@NotNullの基本的な使い方だけでなく、@NotEmptyや@NotBlankとの違いについても解説しました。どれも似たように見えますが、対象となる値の種類やチェック内容が異なります。その違いを理解して使い分けることで、より正確な入力チェックができるようになります。特に文字列入力では、単にnullを防ぐだけでなく、空文字や空白のみの入力も防ぎたいケースが多いため、用途に応じた選択が重要です。

さらに、エラーメッセージのカスタマイズや、バリデーショングループを使った柔軟なルール設定についても触れました。これらは一見すると少し難しそうに感じるかもしれませんが、実務では非常によく使われる考え方です。ユーザーに分かりやすいエラーメッセージを返したり、新規登録と更新で異なるチェックを行ったりすることで、アプリケーションの使いやすさと信頼性が大きく向上します。

まとめとしてのシンプルなサンプル

最後に、この記事の内容をぎゅっとまとめたシンプルな@NotNullの使用例をもう一度確認しておきましょう。基本形を何度も見返すことで、自然と書けるようになります。


import jakarta.validation.constraints.NotNull;

public class SampleRequest {

    @NotNull(message = "必須項目です")
    private String value;

    // getterとsetter
}

このように@NotNullを付けるだけで、「値が必ず存在する」というルールをクラスに明確に表現できます。Springのコントローラで@Validと組み合わせれば、リクエストを受け取った時点で自動的にチェックが行われます。これがSpringのバリデーションの基本的な流れです。

先生と生徒の振り返り会話

生徒

「最初は@NotNullって、ただの小さなアノテーションだと思っていましたが、入力チェックの考え方そのものを支えているんですね」

先生

「その通りです。@NotNullはシンプルですが、とても重要です。これを使うことで、プログラムが想定外の状態になるのを防げます」

生徒

「@NotEmptyや@NotBlankとの違いも分かってきました。場面ごとに使い分けるのが大切なんですね」

先生

「ええ。入力チェックは地味に見えますが、アプリケーションの品質を大きく左右します。ここを丁寧に作ると、後々とても楽になりますよ」

生徒

「Springのバリデーションは難しそうだと思っていましたが、流れが分かると意外とシンプルですね」

先生

「そう感じてもらえたなら大成功です。まずは@NotNullをしっかり使いこなして、少しずつ他のバリデーションにも挑戦していきましょう」

生成AIを基礎から学びたい方へ

ChatGPTなどの生成AIをこれから学びたい方に向けて、AIスキルアカデミーの口コミ・評判、料金、無料セミナーの内容を詳しくまとめています。

AIスキルアカデミーの口コミ・評判を詳しく見る
カテゴリの一覧へ
新着記事
New1
Java
JavaのassertFalseとは?JUnit5のAssertionsクラスを初心者向けにわかりやすく解説
新規投稿
New2
Thymeleaf
ThymeleafでDBから取得したデータを編集フォームの初期値にセットする方法!Entity連携を初心者向けに解説
新規投稿
New3
Spring
JavaのSpringで使う@FutureOrPresentアノテーションを完全ガイド!初心者でもわかる日付バリデーション
新規投稿
New4
Java
JavaのLocalDateクラスのgetMonthValueメソッド完全ガイド!初心者でもわかる数値で月を取得する方法
新規投稿
人気記事
No.1
Java&Spring記事人気No1
Servlet
JavaサーブレットのdoPostメソッドとは?初心者向けにやさしく解説!
No.2
Java&Spring記事人気No2
Servlet
JavaのHttpServletResponseクラスを初心者向けに徹底解説!
No.3
Java&Spring記事人気No3
Servlet
JavaのHttpServletRequestWrapperとgetSessionメソッドの使い方を徹底解説!初心者向けServletのセッション管理入門
No.4
Java&Spring記事人気No4
Servlet
JavaのServletExceptionクラスを初心者向けに徹底解説!
No.5
Java&Spring記事人気No5
Servlet
JavaのHttpSessionインターフェースとgetSessionContextメソッドを徹底解説!初心者でもわかるセッション管理の基本
No.6
Java&Spring記事人気No6
Java
JavaのStringクラスとlengthメソッドを完全解説!初心者でも理解できる文字列の長さ取得の使い方
No.7
Java&Spring記事人気No7
Servlet
JavaのHttpSessionAttributeListenerとattributeRemovedメソッドの使い方を徹底解説!初心者でもわかるセッション属性の削除と監視
No.8
Java&Spring記事人気No8
Java
Javaのクラスとインスタンス化、コンストラクタの使い方完全ガイド!初心者でもわかるオブジェクト指向の基礎