Проверка нескольких полей (custom + notnull) при использовании весенней проверки - PullRequest
0 голосов
/ 30 мая 2019

У меня есть dto, как это

@FieldMatch(first = "email", second = "emailConfirm", message = "E-posta adresleri eslesmeli")
public class EmailDTO {


    private String email;


    private String emailConfirm;

это валидатор

public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object> {


    private String firstFieldName;
    private String secondFieldName;
    private String message;

    @Override
    public void initialize(final FieldMatch constraintAnnotation) {
        firstFieldName = constraintAnnotation.first();
        secondFieldName = constraintAnnotation.second();
        message = constraintAnnotation.message();
    }

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext context) {
        boolean valid = true;
        try
        {
            final Object firstObj = BeanUtils.getProperty(value, firstFieldName);
            final Object secondObj = BeanUtils.getProperty(value, secondFieldName);

            valid =  firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj);
        }
        catch (final Exception ignore)
        {
            // ignore
        }

        if (!valid){
            context.buildConstraintViolationWithTemplate(message)
                    .addPropertyNode(firstFieldName)
                    .addConstraintViolation()
                    .disableDefaultConstraintViolation();
        }

        return valid;
    }
}

это интерфейс

arget({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@Documented
public @interface FieldMatch {


    String message() default "The fields must match";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    String first();
    String second();

    @Target({TYPE, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
    @interface List
    {
        FieldMatch[] value();
    }
}

но я также хочу изменить класс на этот

@FieldMatch(first = "email", second = "emailConfirm", message = "E-posta adresleri eslesmeli")
public class EmailDTO {



     @Max(value = 150, message = "E-posta karakter sayisi fazla!")
        @Email(message = "Email should be valid")
        @NotNull(message = "Name cannot be null")
        @NotEmpty(message = "Name cannot be null")
        private String email;

        @Max(value = 150, message = "E-posta karakter sayisi fazla!")
        @Email(message = "Email should be valid")
        @NotNull(message = "Name cannot be null")
        @NotEmpty(message = "Name cannot be null")
        private String emailConfirm;

Должен ли я использовать другое общее ограничение или множество аннотаций, как показано выше? У меня также есть другие объекты, такие как password и т. Д., И эти объекты также будут иметь такие же проверки.

Некоторые поля могут быть nullable, поэтому не каждое поле должно проверяться нулевым ограничением. Я хочу сделать очень общую проверку. Я отправлю на передний конец (thymeleaf), поэтому мне нужно посмотреть, какое ограничение нарушено.

Электронная почта имеет @email аннотацию, которая не будет в проверке пароля. Другие распространены. как

notnull, notempty, matching, notblank

Мне не удалось найти хороших примеров. Я нашел сообщения на эту тему ниже, но я не смог найти пример пользовательского +, например @email проверка вместе.

...