JavaのSpringで使う@NotEmptyアノテーションを完全解説!初心者でも理解できる入力チェックの基本
生徒
「Springのバリデーションで@NotEmptyというアノテーションを見たんですが、これはどういう意味なんですか?」
先生
「@NotEmptyアノテーションは、値がnullでなく、さらに空であってはいけないことを保証するものです。文字列やリスト、配列に使われることが多いんですよ。」
生徒
「なるほど、nullだけじゃなくて空文字や空リストもダメなんですね。実際にはどんな場面で使うんでしょうか?」
先生
「例えばユーザー登録フォームでメールアドレスやパスワードを必須にしたいときです。入力が空だと困るので@NotEmptyでチェックします。」
1. @NotEmptyアノテーションとは何か
@NotEmptyアノテーションはJavaのBean Validation仕様に含まれる制約アノテーションのひとつです。Spring BootやSpring MVCのアプリケーションでフォーム入力やREST APIリクエストを検証するときに使われます。
このアノテーションは値がnullでないことに加えて、空文字列や要素数ゼロのコレクションも禁止します。そのため、必須入力項目を確実にチェックするために役立ちます。
2. 基本的な使い方
@NotEmptyの使い方はとてもシンプルです。対象のフィールドにアノテーションを付けるだけで、入力検証が自動で行われます。
import jakarta.validation.constraints.NotEmpty;
public class UserRequest {
@NotEmpty
private String email;
@NotEmpty
private String password;
// getterとsetter
}
この例ではemailとpasswordがnullや空文字だった場合にバリデーションエラーとなります。
3. 実行例とエラーメッセージ
Spring Bootのコントローラで@Validを指定すると@NotEmptyのチェックが動作します。
@PostMapping("/register")
public ResponseEntity<String> register(@Valid @RequestBody UserRequest request) {
return ResponseEntity.ok("登録成功");
}
{
"email": "",
"password": ""
}
{
"errors": [
{
"field": "email",
"message": "must not be empty"
},
{
"field": "password",
"message": "must not be empty"
}
]
}
空文字や要素ゼロが送信されると自動的に「must not be empty」というエラーが返されます。
4. @NotNullや@NotBlankとの違い
@NotEmptyは似たアノテーションとよく比較されます。それぞれの違いを理解して使い分けることが大切です。
- @NotNull … 値がnullでなければOK。空文字や空リストは許可される。
- @NotEmpty … nullも空も禁止。必ず値が存在し要素がある必要がある。
- @NotBlank … 文字列専用で、nullや空白文字のみは禁止。スペースだけの入力も不可。
例えばメールアドレスなら@NotEmpty、パスワードなら@NotBlankを使う方が適切です。
5. 実務での活用例
@NotEmptyアノテーションは次のような場面でよく使われます。
- ユーザー登録でメールアドレスやパスワードを必須にする
- 検索フォームでキーワード入力を必須にする
- 商品の注文でリストに必ず1件以上のアイテムが含まれるようにする
このようにシステムの利用に必須な情報を確実に入力させるためにとても便利です。
6. エラーメッセージのカスタマイズ
@NotEmptyのデフォルトメッセージは「must not be empty」ですが、日本語に変更することも可能です。Spring BootではValidationMessages.propertiesを用意して以下のように定義します。
email.notempty=メールアドレスは必ず入力してください
password.notempty=パスワードは必ず入力してください
@NotEmpty(message = "{email.notempty}")
private String email;
@NotEmpty(message = "{password.notempty}")
private String password;
これでユーザーに分かりやすいメッセージを表示でき、システムの利便性が向上します。
7. コレクションや配列に使う場合
@NotEmptyは文字列だけでなく、リストや配列にも使えます。例えば商品の注文リクエストに商品リストを必須にする場合です。
public class OrderRequest {
@NotEmpty
private List<String> items;
// getterとsetter
}
この場合、itemsがnullや空リストで送られた場合はエラーとなります。
8. バリデーショングループと併用する方法
新規登録と更新処理でルールを変えたい場合は、バリデーショングループを使うのが便利です。
public class ValidationGroups {
public interface Create {}
public interface Update {}
}
public class UserRequest {
@NotEmpty(groups = ValidationGroups.Create.class)
private String email;
@NotEmpty(groups = {ValidationGroups.Create.class, ValidationGroups.Update.class})
private String password;
}
こうして状況に応じた柔軟な入力チェックが可能になります。
9. REST API設計での@NotEmptyの役割
REST APIの設計では、クライアントから送られてくるデータに必須項目が空でないことを保証することが重要です。@NotEmptyを使えば、余計なif文を書かなくても自動で検証されます。
さらにSwaggerやOpenAPIを導入している場合も、@NotEmptyは必須項目として反映され、APIドキュメントの品質を高めることができます。
まとめ
ここまで@NotEmptyアノテーションの基本から実践的な使い方まで丁寧に確認してきましたが、実際の現場ではとても役立つ入力チェックとして多くの開発者に活用されています。特にフォーム入力やRESTAPIの必須項目を確実に検証する場面では欠かせない存在であり、初心者が最初に身につけておくべき重要なバリデーションの一つだといえます。空文字や空配列を確実に防ぐことで期待したデータを安全に取り扱えるようになり、システムの安定性や信頼性も向上します。さらに@NotNullや@NotBlankとの違いをしっかり理解しておくことで、フィールドに応じてより適切なバリデーションを選択できるようになり、アプリケーション全体の品質を高めることにつながります。 また、国際化対応のエラーメッセージ設定やエラーメッセージプロパティの活用により、ユーザーにとって理解しやすいメッセージを返せる点も重要です。メッセージ一つ変わるだけでも入力者の心理的負担は大きく変わるため、親切で伝わりやすいメッセージを適切に設定することはユーザー体験向上に直結します。さらに、バリデーショングループを使用すれば新規作成と更新でチェック内容を変える柔軟性も得られ、より大規模なシステムにも対応できる高い拡張性を備えた構成を簡単に実現できます。 RESTAPIとの組み合わせやリスト入力の検証など、さまざまなシーンで@NotEmptyが活躍することを理解しておくことで、より正確で使いやすいアプリケーション開発ができるようになります。フォーム入力の必須チェック、APIのデータ保証、コレクションの空チェックなど、幅広い用途で活用できるため、迷ったときはまず@NotEmptyを候補に入れておくとよいでしょう。 ここでは復習も兼ねて@NotEmptyの基本的な使い方をもう一度短いサンプルとして掲載しておきます。実際のコードとしてのイメージを思い出しながら確認してみてください。
基本サンプルコード
import jakarta.validation.constraints.NotEmpty;
public class SampleRequest {
@NotEmpty(message = "この項目は入力必須です")
private String name;
@NotEmpty
private List<String> keywords;
// getter setter
}
このように@NotEmptyを指定しておけば空文字や空リストの送信が確実に防がれ、入力値の正しさを効率よく保つことができます。特に初心者のうちは細かな違いに迷いがちなので、まずは@NotEmptyの「空であってはいけない」という特徴を自然に思い出せるよう、何度かサンプルを試しながら体で覚えていくとよいでしょう。 こうした基礎知識を身につけておけば、今後より高度なバリデーションや複雑なデータ構造を扱う際にも理解が深まり、開発効率と品質が大きく向上します。Springの入力チェックは一見難しく見えますが、仕組み自体はとても分かりやすく、慣れるほど開発の強い味方になってくれます。
生徒
「今日のまとめを読んで@NotEmptyの使いどころがかなりはっきりしてきました。特に空リストが許されない場面で便利だと感じました。」
先生
「その理解はとても良いですね。実務ではフォーム入力やAPIのデータ受け取りで想像以上に役立つので、積極的に使ってみるとよいですよ。」
生徒
「@NotNullや@NotBlankとの差も意識して使い分けられるようになりたいです。場面に応じて適切なアノテーションを選ぶことが大事なんですね。」
先生
「そうですね。特に@NotBlankは文字列限定で空白を禁止できるので、パスワードやIDなどでよく使います。状況を考えながら選択すると品質が上がりますよ。」
生徒
「エラーメッセージを日本語化できるのも便利ですね。ユーザーに優しいシステムを作りたいので、今後はメッセージファイルも活用します!」
先生
「とても良い心がけです。小さな工夫ですがユーザー体験に直結しますし、開発者として大切な感覚です。しっかり習得して次のステップに進みましょう。」