2017-12-15 26 views
0

REST 웹 요청에 대한 잭슨 비 직렬화 오류를 처리하는 깨끗한 방법을 찾고 있습니다.스프링 프레임 워크에서 잭슨 비 직렬화 오류 처리

좀 더 정확하게 말하면 : JSON에서 매핑 된 들어오는 DTO 객체에 Enum이 있습니다. 그러나 사용자가 잘못된 값을 보내는 경우 400 Bad Request이 반환됩니다. 올바른 메시지와 함께 422 Unprocessable Entity을 반환하고 싶습니다.

하나의 옵션은 String을 허용하고 Bean 유효성 검사를 사용하는 것입니다. 그러나 모든 enum 값을 주석 (상수가 아님)에 목록으로 전달할 수는 없으므로 모든 enum 값을 개별적으로 전달하고 최신 상태로 유지해야합니다. 전체 응용 프로그램에서 오류가 발생하기 쉽습니다. 나는 이것을 처리하기위한보다 구조적인 방법을 찾고있다.

답변

1

DTO에서 String을 사용하고 주석으로 public @interface EnumValue을 사용하여이 문제를 해결했습니다.

EnumValue는 :

@ReportAsSingleViolation 
@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = EnumValueValidator.class) 
@Target(ElementType.FIELD) 
public @interface EnumValue { 
    Class<? extends Enum> value(); 
    String message() default "The input contains validation errors."; 
    Class<?>[] groups() default { }; 
    Class<? extends Payload>[] payload() default { }; 
} 

유효성 검사기 :

public class EnumValueValidator implements ConstraintValidator<EnumValue, String> { 

    private Class<? extends Enum> enumClass; 
    private String message; 

    @Override 
    public void initialize(final EnumValue constraintAnnotation) { 
     this.enumClass = constraintAnnotation.value(); 
     this.message = constraintAnnotation.message(); 
    } 

    @Override 
    public boolean isValid(final String value, final ConstraintValidatorContext context) { 
     boolean valid = false; 
     for (final Enum enumValue : enumClass.getEnumConstants()) { 
      if (enumValue.name().equals(value)) { 
       valid = true; 
      } 
     } 
     if (!valid) { 
      context.buildConstraintViolationWithTemplate(message) // 
        .addConstraintViolation(); 
     } 
     return valid; 
    } 
}