2013-07-17 49 views
2

结合无效的输入值,我有一个包含一个字段声明如下面发挥框架验证与POJO

@Required 
@IntegerAnnotation 
@Column (length = 4, nullable = false) 
public Integer sort; 

对于游戏的默认的验证注解不支持整数检查模型TestModel.java,所以我创建用于检查输入值的注释验证是否是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,方法创建和方法更新。

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); 
    } 
} 

我发现当用整数值没有进入这一领域的排序,该值将在创建方法无效,这就是为什么我把,如果在IntegerCheck.class空状态。

因此,如果归档排序的值是错误的类型,它将检测到null并返回false。 虽然这不是我所期望的,它会使用错误的类型值来验证,但它的工作...有点。

问题在于更新方法。 对于更新TestModel实例时,它不会显示错误的类型值,而是从数据库中检索原始值。 这真的是一个问题,因为如果从数据库检索到的数据已经是一个整数,它将始终返回true。然后验证不会完成这项工作。

而问题是:

  1. 此验证策略有何建议?我认为也许我除了验证整数值验证的正确方法之外。

  2. 如何从操作中检索错误的类型值,或者它不可能,因为它已经不是该字段的有效数据类型。

回答

0

您在更新方法中看到的行为是Play的工作方式!

下面是从文档relevant section

...当播放查找id字段,它从 编辑它之前加载匹配的实例数据库。然后应用 HTTP请求提供的其他参数。

所以你的情况,当排序财产在更新过程中为空,则使用在数据库中的值。

现在,如果我要尽量做到你正在尝试做的,我会propably做这种方式:

在我的模型

@Required 
@CheckWith(IntegerCheck.class) 
public int sort; // using primitive here to avoid null values. 

static class IntegerCheck extends Check { 

    public boolean isSatisfied(Object model, Object sort) { 
     int fieldValue = (int) sort; // here you have the value as int 

     // Here you would check whatever you want and return true or false. 

     return ... 
    } 

}