结合无效的输入值,我有一个包含一个字段声明如下面发挥框架验证与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。然后验证不会完成这项工作。
而问题是:
此验证策略有何建议?我认为也许我除了验证整数值验证的正确方法之外。
如何从操作中检索错误的类型值,或者它不可能,因为它已经不是该字段的有效数据类型。