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

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 and 35' if the field is less than 2 or greater than 35 private String firstName; 

Then I enter an empty value.

It says: "It cannot be empty. The length must be between 2 and 35 '

Is it possible to tell spring to check one at a time in a field?

+7
source share
3 answers

Yes it is possible. Just create your own annotation as follows:

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

The important part is the @ReportAsSingleViolation annotation

+8
source

Use your own restrictions for your field. For example, the @StringField annotation will be used.

 @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 do some logic in the StringFieldValidator class. This class is implemented by the 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, for example:

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

In the end, you will only have one error message, shown in the correct order.

+4
source

A better solution would be to have some markup in the error message so that it is formatted well, like <br /> , and use the CSS class to format the general message. As noted in Bojo's comment, the user should be aware of everything that is wrong.

0
source

All Articles