我正在尝试使用 GWT 2.5 内置验证功能。我有一些复杂的验证。 Cross field validation with Hibernate Validator (JSR 303)建议我可以包含进行验证的方法或编写我自己的注释。但是,两者都不起作用。
public class PageData extends Serializable
@NotNull(message="Cannot be null!")
Boolean value
@AssertTrue(message="isValid() is false!")
private boolean isValid() {
return false;
}
//Getters and Setters
}
bool 值已验证。然而,isValid() 永远不会被调用/验证。但为什么? 这是 GWt 特有的问题吗?
然后我尝试编写自己的注释,Cross field validation with Hibernate Validator (JSR 303)中的@FieldMatch示例使用 Apache Commons BeanUtils 中的 Beans.getProperty(),但我无法在 GWT 中使用它。有没有办法让这些复杂的注释在 GWT 中工作?
最佳答案
以下是我如何创建一个跨一个 bean 的多个字段工作的自定义验证。它检查当联系人 bean 的字段 ContactProfile 设置为 COMPANY 时,必须填写公司名称,否则当设置为 PERSON 时,必须填写名字或姓氏:
注释定义:
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidCompanyOrPersonValidator.class)
public @interface ValidCompanyOrPerson {
String message() default "{contact.validcompanyorperson}";
Class<?>[] groups() default {};
Class<? extends Contact>[] payload() default {};
}
实现:
public class ValidCompanyOrPersonValidator implements ConstraintValidator<ValidCompanyOrPerson, Contact> {
ValidCompanyOrPerson annotation;
public void initialize(ValidCompanyOrPerson annotation) {
this.annotation = annotation;
}
@SuppressWarnings("nls")
public boolean isValid(Contact contact, ConstraintValidatorContext context) {
boolean ret = false;
if (contact.getContactProfile() == null) {
} else if (contact.getContactProfile().equals(ContactProfile.COMPANY)) {
ret = (contact.getCompanyName() != null);
} else if (contact.getContactProfile().equals(ContactProfile.PERSON)) {
ret = (contact.getGivenName() != null || contact.getFamilyName() != null);
}
return ret;
}
}
现在我可以设置
@ValidCompanyOrPerson
public class Contact {
...
}
我可以在客户端 (GWT) 和服务器端使用此验证。
希望有帮助......
关于validation - GWT JSR303 验证、验证方法或使用自定义注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17649513/