以下のように宣言されたフィールドを含むモデル TestModel.java があります
@Required
@IntegerAnnotation
@Column (length = 4, nullable = false)
public Integer sort;
Play のデフォルトのバリデーション アノテーションは Integer チェックをサポートしていないため、入力値が Integer かどうかをチェックするためのアノテーションバリデーションを作成します。
IntegerAnnotation.java :
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(checkWith = IntegerCheck.class)
public @interface IntegerAnnotation {
String message() default IntegerCheck.message;}
}
この注釈は IntegerCheck.java の実装を参照します
public class IntegerCheck extends AbstractAnnotationCheck<IntegerAnnotation>{
final static String message = "validation.integer";
@Override
public boolean isSatisfied(Object validatedObject, Object value, OValContext context, Validator validator) throws OValException {
// TODO Auto-generated method stub
if(value == null) return false;
return isInteger(value.toString());
}
private static boolean isInteger(String s) {
return isInteger(s,10);
}
private static boolean isInteger(String s, int radix) {
if(s.isEmpty()) return false;
for(int i = 0; i < s.length(); i++) {
if(i == 0 && s.charAt(i) == '-') {
if(s.length() == 1) return false;
else continue;
}
if(Character.digit(s.charAt(i), radix) < 0) return false;
}
return true;
}
}
また、TestModel を作成または更新するためのコントローラーには、メソッドの作成とメソッドの更新の 2 つのアクションがあります。
public static void create(@Valid TestModel testModel){
if(validation.hasErrors()) {
params.flash();
validation.keep();
blank();
}
}
public static void update(@Valid TestModel testModel) {
if(validation.hasErrors()) {
params.flash();
validation.keep();
}
else{
testModel.save();
show(sys5000.id);
}
}
フィールドの並べ替えに整数値が入力されていない場合、create メソッドで値が null になることがわかりました。そのため、IntegerCheck.class に if null 条件を追加しました。
したがって、フィールド ソートの値が間違ったタイプの場合、null を検出して false を返します。間違った型の値を使用して検証するとは思いませんが、うまくいきました...ちょっと。
問題は更新方法にあります。TestModel のインスタンスを更新する場合、間違った型の値は表示されず、代わりにデータベースから取得された元の値が表示されます。データベースから取得したデータがすでに整数である場合、常に true を返すため、これは本当に問題です。その後、検証は機能しません。
質問は次のとおりです。
この検証戦略に関するアドバイスはありますか? おそらく、整数値の検証を検証する正しい方法から離れていると思います。
アクションから間違った型の値を取得するにはどうすればよいですか、またはそのフィールドの有効なデータ型ではないため、それは不可能です。