GWT JSR303验证,验证方法或使用自定义注释

时间:2013-07-15 08:08:57

标签: validation gwt hibernate-validator

我正在尝试使用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中起作用?

1 个答案:

答案 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)和服务器端使用此验证。

希望有所帮助....

相关问题