2013-07-17 90 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 ... 
    } 

}