我刚刚开始测试JSR-303 Bean验证,并想知道是否有可能。我们的app中有一个默认的正则表达式,用于所有String字段。如果我想使用bean验证来应用它,我想我需要在表单对象中注释每个字段。
@Pattern(regexp = REG_EXP)
private String aString;
@Pattern(regexp = REG_EXP)
private String anotherString;
是否可以在一次点击中将@Pattern应用于所有字符串(或某些字段)?我们在Weblogic 10.3.4上使用Hibernate实现,JSF2.0作为前端。验证应该独立于视图,因为我可能会从Web服务进入。
答案 0 :(得分:2)
要一次验证多个字段,请在type-Level上使用注释,并编写一个自定义Validator,使用您的REGEXP检查所有String字段。
编辑:提供示例。这非常难看,因为它使用了Reflection并违反了安全性,但它可能会给你一个大概的想法。如果你不使用“对象”而是使用具体的类或接口,你可能会成功使用常规的getter。
受测试的班级(和跑步者)
import javax.validation.Validation;
import javax.validation.Validator;
import validation.AllStringsRegex;
@AllStringsRegex(value="l")
public class UnderValidation {
String a;
String b;
public static void main(String... args) {
UnderValidation object = new UnderValidation();
object.a = "hello";
object.b = "world";
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
System.out.println(validator.validate(object));
}
}
我的注释:
@Target( { TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = AllStringsRegexValidator.class)
@Documented
public @interface AllStringsRegex {
String message() default "String not regex";
String value() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
我的验证员
public class AllStringsRegexValidator implements ConstraintValidator<AllStringsRegex, Object> {
private Pattern pattern = null;
@Override
public void initialize(AllStringsRegex annotation) {
pattern = Pattern.compile(annotation.value());
}
@Override
public boolean isValid(Object object, ConstraintValidatorContext ctx) {
for (Field f : object.getClass().getDeclaredFields()) {
if (f.getType().equals(String.class)) {
try {
f.setAccessible(true);
String value = (String)f.get(object);
if (!pattern.matcher(value).find()) {
return false;
}
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return true;
}
}
答案 1 :(得分:0)
我没有使用java支持脚本在服务器端使用groovy,javascript ..。你可以检查@ScriptAssert(lang = "javascript", script =_this.startDate.before(_this.endDate)
脚本注释,这是hibernate注释。