Play Frameworkの日付・数値入力を徹底解説!初心者でも安心バリデーション
生徒
「Play Frameworkで、誕生日や注文数などの『日付』や『数値』が正しく入力されているかチェックする方法はありますか?」
先生
「はい、Play Frameworkのバリデーション機能を使えば、特定の日付形式や数値の範囲を簡単に検証することができますよ。」
生徒
「もし、ありえない日付やマイナスの注文数が入力されたらどうなるんですか?」
先生
「アノテーションという印を付けるだけで、自動的にエラーとして検出してくれます。それでは、具体的な検証方法を見ていきましょう!」
1. 日付・数値の検証とは?
ウェブサイトの入力フォームにおいて、数値や日付のデータは非常に重要な役割を果たします。しかし、ユーザーが常に正しい形式で入力してくれるとは限りません。例えば、年齢の欄に「二十歳」と漢字で書かれたり、予約日に存在しない「2月30日」が入力されたりすることがあります。これらをプログラム側で「それは正しくない入力ですよ」と判定することをバリデーション(入力検証)と呼びます。
Play Framework(プレイフレームワーク)は、Java言語でウェブアプリを開発するための強力な道具です。これを使うと、複雑な計算やチェックのプログラムを自力で書かなくても、簡単な設定だけで日付の形式(2026/02/06など)や、数値の範囲(1から100までなど)を厳格にチェックできるようになります。未経験の方でも、データの「型」と「ルール」を意識するだけで、プロのような確実なシステム作りが可能になります。
2. 数値入力の範囲制限(MinとMax)
まずは数値のチェックから学びましょう。商品の注文数や年齢のように、絶対にマイナスになってはいけない数値や、上限を決めたい数値があります。Play Frameworkでは、@Constraints.Min(最小値)や@Constraints.Max(最大値)というアノテーションを、データの定義の上に書き込みます。
これを使えば、「1個以上、10個以下の注文しか受け付けない」といったルールが簡単に作れます。もしルールに外れた入力があれば、フレームワークが自動的にエラーメッセージを生成してくれるため、開発効率が飛躍的に向上します。
package models;
import play.data.validation.Constraints;
public class OrderForm {
@Constraints.Required
@Constraints.Min(1)
@Constraints.Max(99)
public Integer quantity;
@Constraints.Min(0)
public Integer age;
}
このコードでは、注文数(quantity)は1から99の間、年齢(age)は0以上であれば合格となります。IntegerはJavaで「整数」を扱うための箱(データ型)の名前です。初心者の方は、まずこの「アノテーションで範囲を囲む」という感覚を覚えましょう。
3. 日付形式の指定と検証
次に日付のチェックです。日付は「西暦から書くのか」「スラッシュを入れるのか」など、書き方が人によってバラバラになりがちです。Play Frameworkでは、@Formats.DateTimeというアノテーションを使って、受け取りたい日付の形(パターン)を指定します。
例えば「2026-02-06」という形に統一したい場合、そのパターンを指定しておけば、それ以外の書き方で入力された時に「形式が違います」とエラーにしてくれます。また、Javaの新しい日付クラスである LocalDate を使うことで、より安全に日付を扱うことができます。
package models;
import play.data.format.Formats;
import play.data.validation.Constraints;
import java.time.LocalDate;
public class ReservationForm {
@Constraints.Required
@Formats.DateTime(pattern = "yyyy-MM-dd")
public LocalDate reservationDate;
}
yyyy-MM-dd というのは、「年4桁-月2桁-日2桁」という意味の記号です。このようにパターンを指定することで、データベースに保存する際もエラーが起きにくくなり、正確な予約管理ができるようになります。パソコン操作に不慣れなユーザーが誤って「明日」などと文字で入力しても、プログラムがしっかりガードしてくれます。
4. 入力フォームHTMLでの記述方法
バリデーションを設定したら、それを画面(ビュー)と繋げる必要があります。Play Frameworkの標準テンプレートである「Twirl(トワール)」を使えば、数値専用の入力欄や日付専用のカレンダー入力欄を簡単に作ることができます。
HTML5という仕組みには、最初から数値用の type="number" や日付用の type="date" という設定があります。これを使うと、スマホで操作した時に数字キーボードが自動で出たり、カレンダーが表示されたりします。Play Frameworkのヘルパー機能を使ってこれらを出力してみましょう。
@import play.data.Form
@import helper._
@(myForm: Form[models.OrderForm])
@helper.form(action = routes.OrderController.submit()) {
@helper.inputText(
myForm("quantity"),
'type -> "number",
'_label -> "注文個数",
'min -> "1",
'max -> "99"
)
@helper.inputText(
myForm("age"),
'type -> "number",
'_label -> "年齢"
)
<button type="submit" class="btn btn-primary">注文を確定する</button>
}
画面側でも min や max を指定することで、ブラウザ(ウェブを見るソフト)が送信前に軽くチェックしてくれます。しかし、これはあくまで補助的なもので、最終的な「正しいかどうかの審判」はサーバー側のJavaプログラムが行うのが鉄則です。
5. コントローラでのエラー判定の流れ
画面からデータが送られてきたとき、コントローラという司令塔の役割をするプログラムがバリデーションの結果を確認します。bindFromRequest() というメソッドを呼び出すと、一瞬で全てのルール(数値の範囲や日付の形)が検査されます。
もし違反が見つかれば、hasErrors() が「はい(真)」となります。この場合、エラーメッセージを表示するために元の入力画面に戻す処理を書きます。逆にエラーがなければ、無事に注文処理や予約登録へ進むことができます。この「もしエラーなら戻す、そうでなければ進む」という流れが、ウェブアプリの基本動作です。
package controllers;
import play.mvc.*;
import play.data.Form;
import play.data.FormFactory;
import javax.inject.Inject;
import models.ReservationForm;
public class ReservationController extends Controller {
@Inject
FormFactory formFactory;
public Result submit() {
// 画面からの入力を受け取って検証する
Form<ReservationForm> f = formFactory.form(ReservationForm.class).bindFromRequest();
if (f.hasErrors()) {
// エラーがある場合は入力画面を再表示する
return badRequest(views.html.reservation.render(f));
}
// 検証合格!データを取り出して処理を続ける
ReservationForm data = f.get();
return ok("予約日は " + data.reservationDate + " で受け付けました。");
}
}
6. エラーメッセージを分かりやすく伝える
バリデーションでエラーになったとき、ユーザーに「何がダメだったのか」を伝えるのは非常に大切です。Play Frameworkは標準で英語のメッセージを出しますが、これを日本語に変えることができます。プロジェクトの中にある conf/messages というファイルに設定を書き込みます。
例えば、error.min=最小値は{0}です と書いておけば、アノテーションで設定した数字が自動的に入り、「最小値は1です」のような分かりやすい日本語になります。初心者の方は、まずプログラムがエラーを検知できるようになったら、次は「使う人に優しいメッセージ」を出す工夫をしてみましょう。それが使いやすいシステムを作る第一歩です。
7. 日付・数値検証の注意点
最後に、少しだけ注意点をお話しします。日付を検証するとき、未来の日付しか受け付けたくない場合や、過去の日付だけを入力させたい場合があります。標準のアノテーションだけでは足りない場合、自分でチェック用のプログラム(カスタムバリデーター)を作ることもできます。しかし、まずは今回学んだ基本的なアノテーションを使いこなすことが先決です。
また、数値の検証では、小数点を含む数字(体重や身長など)を扱う場合、Integer ではなく Double や BigDecimal という型を使います。データの種類に合わせて適切な箱を選ぶことも、正しいバリデーションを行うための重要なポイントです。最初は難しく感じるかもしれませんが、一つずつ試していけば必ず理解できるようになります。Play Frameworkの便利な機能を味方につけて、安全で正確なフォーム処理をマスターしていきましょう!