2

我正在尝试使用 GWT 的 2.5 内置验证功能。我有一些复杂的验证。 使用 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 的问题吗?

然后我尝试编写自己的注释,使用 Hibernate Validator (JSR 303) 进行跨字段验证中的 @FieldMatch 示例使用来自 Apache Commons BeanUtils 的 Beans.getProperty(),我无法在 GWT 中使用它。有没有办法让这些复杂的注释在 GWT 中工作?

4

1 回答 1

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)和服务器端使用这个验证。

希望有帮助....

于 2013-07-15T11:14:16.997 回答