>

요청이 있습니다   WorkerRequest 가있는 곳  어느 enum 있다 FULL_TIME  등등.

MANAGER 에서  이 열거 형에 길이 유효성 검사를 어떻게 적용 할 수 있습니까?

예 : 열거 형 유형은 8자를 초과 할 수 없습니다.

WorkerRequest  유효한 (8 자)

FULL_TIME  유효하지 않은 (9 자)

현재 PERMANENT 를 넣으면

javax.validation.constraints.Size

오류가 발생합니다 :

와이즈 비즈 @Size(min = 0, max = 8, message = "Allowed length for workerType is 8.") @Enumerated(EnumType.STRING) private WorkerType workerType;
  • 답변 # 1

    @Size, @Length와 @Column (length = value)의 차이점에 설명 된대로

    와이즈 비즈

    db에서 열거 형 값을 유지하는 데 필요한 최대 길이 만 지정할 수 있습니다. 예를 들어,

    @Sizeis a Bean Validation annotation that validates that the associatedStringhas a value whose length is bounded by the minimum and maximum values.

    를 정의하면  @Size 대신 @Column(length = 8) 가 표시됩니다.  db 정의에 상응하게.

    그러나 이에 대한 해결 방법이 있습니다.

    workerType VARCHAR(8)
    
    

    <올>

    맞춤 확인 주석 정의 :

    public enum WorkerType {PERMANENT , FULL_TIME, ...};
    
    

    검사기 구현 :

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = EnumSizeLimit.class)
    public @interface EnumSizeLimit {
        String message() default "{com.example.app.EnumSizeLimit.message}";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
        Class<? extends Enum<?>> targetClassType();
    }
    
    

    필드 정의 :

    public class EnumSizeLimitValidator implements ConstraintValidator < EnumSizeLimit , String > {
         private Set < String > allowedValues;
         @SuppressWarnings({
             "unchecked",
             "rawtypes"
         })
        @Override
        public void initialize(EnumSizeLimit targetEnum) {
        Class << ? extends Enum > enumSelected = targetEnum.targetClassType();
        allowedValues = (Set < String > ) EnumSet.allOf(enumSelected).stream().map(e - > ((Enum << ? extends Enum << ? >> ) e).name())
            .collect(Collectors.toSet());
        }
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            return value == null || (value.length>=0 && value.length<=8)) ? true : false;
        }
    }
    
    

  • 답변 # 2

    크기 검증이 필요하지 않습니다. 요청에서 enum을 사용한다는 사실은 직렬화를 통해 값을 열거 가능한 값 중 하나에 매핑해야합니다. 작업자 유형으로 문자열 json을 "유효하지 않음"으로 채우면 스프링에서 다음을 throw합니다.

    org.springframework.http.converter.HttpMessageNotReadableException : JSON 구문 분석 오류 : @EnumSizeLimit (targetClassType = WorkerType.class, message = "your message" private String workerType; 유형의 값을 역 직렬화 할 수 없습니다.  from String "invalid": 선언 된 Enum 인스턴스 이름 중 하나가 아닌 값 : etc.

    맞춤 휴식 예외 처리기에서 예외를 잡을 수 있습니다

    WorkerType

관련 자료

  • 이전 currency - 프로그래밍 방식으로 암호 화폐 이전
  • 다음 java - 스프링 툴 스위트와 MySQL을 연결할 수 없습니까?