【问题标题】:GWT JSR303 Validation, validate method OR use custom annotationsGWT JSR303 验证、验证方法或使用自定义注释
【发布时间】:2013-07-13 00:55:24
【问题描述】:

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

【问题讨论】:

    标签: validation gwt hibernate-validator


    【解决方案1】:

    以下是我如何创建跨一个 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) 和服务器端使用此验证。

    希望对您有所帮助....

    【讨论】:

    • @chriscross 有帮助吗?
    • @xybrek 是的,确实如此。
    • 什么是ValidCompanyOrPerson注解;为了?什么时候不使用?只是好奇
    • @xybrek 我的联系人类作为枚举字段类型,可以设置为个人或公司;验证器确保当标记为人员时,字段 givenName 或 familyName 不为空,当标记为公司时,公司名称不为空。
    猜你喜欢
    • 2011-07-08
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多