복붙노트

[SPRING] Spring MVC 유효성 검사에서 한 번에 필드 당 하나의 오류 메시지 만 표시 할 수 있습니까?

SPRING

Spring MVC 유효성 검사에서 한 번에 필드 당 하나의 오류 메시지 만 표시 할 수 있습니까?

예,

나는 가지고있다

@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 '사이 여야합니다.

필드 당 한 번에 하나씩 유효성을 검사하도록 봄을 말할 수 있습니까?

해결법

  1. ==============================

    1.가능합니다. 다음과 같이 자신 만의 주석을 작성하십시오.

    가능합니다. 다음과 같이 자신 만의 주석을 작성하십시오.

    @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 주석입니다.

  2. ==============================

    2.필드에 사용자 지정 제약 조건을 사용하십시오. 예를 들어, annotate @StringField를 사용합니다.

    필드에 사용자 지정 제약 조건을 사용하십시오. 예를 들어, 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 {};
    } 
    

    그런 다음 StringFieldValidator 클래스에서 일부 논리를 만듭니다. 이 클래스는 인터페이스 ConstraintValidator 에 의해 구현됩니다.

    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")
    

    결국 올바른 순서로 표시된 오류 메시지가 하나만 나타납니다.

  3. ==============================

    3.더 나은 해결책은 오류 메시지에 마크 업을 사용하여
    과 같이 멋지게 형식을 지정하고 CSS 클래스를 사용하여 전체 메시지를 형식화하는 것입니다. Bozho의 코멘트에서 언급했듯이, 사용자는 잘못된 모든 것을 알고 있어야합니다.

    더 나은 해결책은 오류 메시지에 마크 업을 사용하여
    과 같이 멋지게 형식을 지정하고 CSS 클래스를 사용하여 전체 메시지를 형식화하는 것입니다. Bozho의 코멘트에서 언급했듯이, 사용자는 잘못된 모든 것을 알고 있어야합니다.

  4. from https://stackoverflow.com/questions/7555201/in-spring-mvc-validation-is-it-possible-to-show-only-one-error-message-per-fiel by cc-by-sa and MIT license