我正在尝试使用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
}
布尔值已经过验证。但是,永远不会调用/验证 isValid()。但为什么? 这是GWt特有的问题吗?
然后我尝试编写自己的注释,Cross field validation with Hibernate Validator (JSR 303)中的@FieldMatch示例使用来自Apache Commons BeanUtils的Beans.getProperty(),我无法在GWT中使用它。有没有办法让这些复杂的注释在GWT中起作用?
答案 0 :(得分:3)
以下是我创建一个跨一个bean的多个字段的自定义验证的方法。它检查当Contact 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)和服务器端使用此验证。
希望有所帮助....