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 の例では、GWT では使用できない Apache Commons BeanUtils の Beans.getProperty() を使用しています。この種の複雑な注釈を GWT で機能させる方法はありますか?

4

1 に答える 1

3

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) とサーバー側の両方で使用できます。

それが役立つことを願っています....

于 2013-07-15T11:14:16.997 に答える