In Spring MVC validation, Is it possible to show only one error message per field at a time?

前端 未结 3 1055
礼貌的吻别
礼貌的吻别 2020-12-15 12:03

Example,

I have

@NotEmpty //tells you \'may not be empty\' if the field is empty
@Length(min = 2, max = 35) //tells you \'length must be between 2 an         


        
相关标签:
3条回答
  • 2020-12-15 12:45

    Yes it is possible. Just create your own annotation like this:

    @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 {};
    }
    

    important part is the @ReportAsSingleViolation annotation

    0 讨论(0)
  • 2020-12-15 12:49

    Use custom constraints for your field. For example, will use annotate @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 {};
    } 
    

    Then make some logic in StringFieldValidator class. This class implemented by an interface 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;
        }
    }
    

    Then you can use annotation like:

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

    And after all, you will have only one error message shown in right order.

    0 讨论(0)
  • 2020-12-15 12:55

    A better solution would be to have some markup in your error message so that it formats nicely, such as a <br />, and use a CSS class to format the overall message. As noted in Bozho's comment, a user should be aware of everything that is incorrect.

    0 讨论(0)
提交回复
热议问题