春ブーツの検証 - 2ではないヌルから1

JackTheKnife:

私は2つのフィールドのいずれかが、春ブーツ内のNULLでないかどうかを検証しようとしていますか?

私は、メインのオブジェクトのメソッドクラスであることを設定しました:

@NotNull(message = "Username field is required")
private String username;

@NotNull(message = "Email field is required")
private String email;

それは両方のフィールドNOT NULLを持つことが必要になります。それから私は、ここで説明したカスタム検証を行ってきましたhttps://lmonkiewicz.com/programming/get-noticed-2017/spring-boot-rest-request-validation/が、私は仕事にその例を取得することができませんでした。私は、スタック上に持っています

Userクラスの宣言:

@CombinedNotNull(fields = {"username","email"})
public class User implements {

    private long id = 0L;
    @NotNull(message = "First name field is required")
    private String firstName;

    @NotNull(message = "Last name field is required")
    private String lastName;

    private String username;
    private String email;

    @NotNull(message = "Status field is required")
    private String status;

    ...all methods here...
    ...setters and getters...

}

CombibnedNotNullクラス:

@Documented
@Retention(RUNTIME)
@Target({ TYPE, ANNOTATION_TYPE })
@Constraint(validatedBy = userValidator.class)
public @interface CombinedNotNull {
        String message() default "username or email is required";
        Class<?>[] groups() default { };
        Class<? extends Payload>[] payload() default { };
}

userValidatorクラス:

@Component
public class userValidator implements ConstraintValidator<CombinedNotNull, User> {

    @Override
    public void initialize(final CombinedNotNull combinedNotNull) {
        fields = combinedNotNull.fields();
    }

    @Override
    public boolean isValid(final User user, final ConstraintValidatorContext context) {
        final BeanWrapperImpl beanWrapper = new BeanWrapperImpl(user);

        for (final String f : fields) {
            final Object fieldValue = beanWrapper.getPropertyValue(f);

            if (fieldValue == null) {
                return false;
            }
        }

        return true;
    }
}

これを成し遂げるための他の方法はありますか私は、そのページから「複合体」の例で行くべきですか?

LppEdd:

私は(私はIDEなしだ場合でも)あなたのためにそれを実装しようとするでしょう。
インサイドConstraintValidator#initializeあなたが設定されたフィールドの名前のホールドを取得することができますすることができないことをnull

@Override
public void initialize(final CombinedNotNull combinedNotNull) {
    fields = combinedNotNull.fields();
}

内部ConstraintValidator#isValidあなたがチェックするために、これらのフィールドの名前を使用することができるObjectフィールドを。

@Override
public boolean isValid(final Object value, final ConstraintValidatorContext context) {
    final BeanWrapperImpl beanWrapper = new BeanWrapperImpl(value);

    for (final String f : fields) {
       final Object fieldValue = beanWrapper.getPropertyValue(f);

       if (fieldValue == null) {
          return false;
       }
    }

    return true;
}

注釈:

@Retention(RUNTIME)
@Target({ TYPE, ANNOTATION_TYPE })
@Constraint(validatedBy = CombinedNotNullValidator.class)
public @interface CombinedNotNull {
   String message() default "username or email is required";
   Class<?>[] groups() default { };
   Class<? extends Payload>[] payload() default { };

   /** Fields to validate against null. */
   String[] fields() default { };
}

注釈は、次のように適用することができ

@CombinedNotNull(fields = {
      "fieldName1",
      "fieldName2"
})
public class MyClassToValidate { ... }

クラスレベルの制約アノテーションを作成する方法については、公式ドキュメントを常に参照してください。ドキュメント

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=181331&siteId=1