結合無效的輸入值,我有一個包含一個字段聲明如下面發揮框架驗證與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。然後驗證不會完成這項工作。
而問題是:
此驗證策略有何建議?我認爲也許我除了驗證整數值驗證的正確方法之外。
如何從操作中檢索錯誤的類型值,或者它不可能,因爲它已經不是該字段的有效數據類型。