Play framework(7) - モデルでのバリデーション
Play frameworkでは ドメインオブジェクトモデル のページで、
モデルを「Play アプリケーションの中心的な存在」であると定義しています。
これを実現するため、ビジネスロジックであるエラーチェック処理を
モデル内で実装してみました。
まず、今回の画面と仕様についてです。
以下の画面はユーザー情報を登録する画面です。「Create」ボタン押下時にエラーチェックを行います。
では、ソースを見ていきたいと思います。
◆モデル
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画面を呼び出しています。
実際にエラーになるような入力を行うと、以下のようにエラーが表示されます。