ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

Play framework(7) - モデルでのバリデーション

Play frameworkでは ドメインオブジェクトモデル のページで、
モデルを「Play アプリケーションの中心的な存在」であると定義しています。

これを実現するため、ビジネスロジックであるエラーチェック処理を
モデル内で実装してみました。

まず、今回の画面と仕様についてです。
以下の画面はユーザー情報を登録する画面です。「Create」ボタン押下時にエラーチェックを行います。

f:id:UnderSourceCode:20130504101359j:plain

では、ソースを見ていきたいと思います。

◆モデル


package models;

import java.util.*;
import javax.persistence.*;

import play.db.jpa.*;
import play.data.validation.*;

@Entity
public class User extends Model {

@Required(message = "ユーザー名を入力して下さい。")
public String name = "";

@Required(message = "パスワードを入力して下さい。")
@CheckWith(PasswordCheck.class)
public String password = "";

@Email(message = "Emailの形式で入力して下さい。")
@Required(message = "Emailを入力して下さい。")
public String email = "";

@Required
public boolean isAdmin = false;

public User(String name, String password, String email, boolean isAdmin) {
this.name = name;
this.password = password;
this.email = email;
this.isAdmin = isAdmin;
}

public static User login(String name, String password) {
return find("byNameAndPassword", name, password).first();
}

public static List index(){
return User.find("order by id").from(0).fetch();
}

public void update(User user){
this.name = user.name;
this.password = user.password;
this.email = user.email;
this.isAdmin = user.isAdmin;
save();
}

static class PasswordCheck extends Check {
public boolean isSatisfied(Object validatedObject, Object value) {
User user = (User)validatedObject;
if(user.password.length() < 6){
setMessage("パスワードが短すぎます。");
return false;
}
return true;
}
}
}


モデルのメンバ変数にアノテーションを追加することで、バリデーションを定義しています。
@Requiredは入力必須、@EmailはEmail形式での入力をを意味し、それぞれのエラー時に表示する
エラーメッセージを定義しています。

passwordのエラーチェックは、用意されているアノテーションでは対処できたいため
カスタムバリデータを使用しています。

カスタムバリデータは@CheckWithアノテーションを追加することで実装し
アノテーションの引数にバリデーションのロジックを実装するクラスを指定します。

カスタムバリデータのロジックを実装したPasswordCheckクラスでは
パスワードの文字数チェックと、エラー時のエラーメッセージを定義しています。

◆コントローラ


public class UserController extends Controller {
public static void dbCreate(@Valid User user){
if(validation.hasErrors()){
render("UserController/create.html", user);
}else{
user.save();
index();
}
}
}

dbCreateメソッドが画面の「Create」ボタンを押下すると呼び出されるアクションです。
引数に画面の入力値を保持するUserクラスを取っていますが、そのUserクラスの@Validアノテーション
付与しています。
この@Validアノテーションがあることで、引数のモデル内(ここではUserクラス)で実装した
バリデーションチェックが実行されます。
バリデーションチェックの結果は、validation.hasErrors()で取得することができ
ここではエラー時には再びCreate画面を呼び出しています。

実際にエラーになるような入力を行うと、以下のようにエラーが表示されます。
f:id:UnderSourceCode:20111120212158j:plain