В валидации Spring MVC, возможно ли показывать только одно сообщение об ошибке на поле за раз? - PullRequest
7 голосов
/ 26 сентября 2011

Пример,

У меня есть

@NotEmpty //tells you 'may not be empty' if the field is empty
@Length(min = 2, max = 35) //tells you 'length must be between 2 and 35' if the field is less than 2 or greater than 35
private String firstName;

Затем я ввожу пустое значение.

В нем говорится, 'не может быть пустым длина должна быть от 2 до 35'

Можно ли сказать пружине проверять по одному для каждого поля?

Ответы [ 3 ]

8 голосов
/ 29 сентября 2011

Да, это возможно. Просто создайте свою собственную аннотацию так:

@Documented
@Constraint(validatedBy = {})
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@ReportAsSingleViolation
@NotEmpty
@Length(min = 2, max = 35)
public @interface MyAnnotation {

    public abstract String message() default "{mypropertykey}";

    public abstract Class<?>[] groups() default {};

    public abstract Class<?>[] payload() default {};
}

важной частью является аннотация @ReportAsSingleViolation

4 голосов
/ 03 июля 2015

Используйте пользовательские ограничения для вашего поля. Например, будет использовать аннотацию @StringField.

@Target(ElementType.FIELD)
@Constraint(validatedBy = StringFieldValidator.class)
@Retention(RetentionPolicy.RUNTIME)

public @interface StringField {

    String message() default "Wrong data of string field";

    String messageNotEmpty() default "Field can't be empty";

    String messageLength() default "Wrong length of field";

    boolean notEmpty() default false;

    int min() default 0;

    int max() default Integer.MAX_VALUE;

    Class<?>[] groups() default {};

    Class<?>[] payload() default {};
} 

Затем создайте логику в классе StringFieldValidator. Этот класс реализован интерфейсом ConstraintValidator <A extends Annotation, T>.

public class StringFieldValidator implements ConstraintValidator<StringField, String> {

    private Boolean notEmpty;
    private Integer min;
    private Integer max;
    private String messageNotEmpty;
    private String messageLength;

    @Override
    public void initialize(StringField field) {
        notEmpty = field.notEmpty();
        min = field.min();
        max = field.max();
        messageNotBlank = field.messageNotEmpty();
        messageLength = field.messageLength();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        context.disableDefaultConstraintViolation();
        if (notEmpty && value.isEmpty()) {
            context.buildConstraintViolationWithTemplate(messageNotEmpty).addConstraintViolation();
            return false;
        }
        if ((min > 0 || max < Integer.MAX_VALUE) && (value.length() < min || value.length() > max)) {
            context.buildConstraintViolationWithTemplate(messageLength).addConstraintViolation();
            return false;
        }
        return true;
    }
}

Тогда вы можете использовать аннотацию, например:

@StringField(notEmpty = true, min = 6, max = 64,
            messageNotEmpty = "Field can't be empty",
            messageLength = "Field should be 6 to 64 characters size")

В конце концов, у вас будет только одно сообщение об ошибке в правильном порядке.

0 голосов
/ 26 сентября 2011

Лучшим решением было бы иметь некоторую разметку в вашем сообщении об ошибке, чтобы оно хорошо форматировалось, например, <br />, и использовать класс CSS для форматирования всего сообщения. Как отмечается в комментарии Божо, пользователь должен знать обо всем, что неверно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...