본문 바로가기
Spring

[Spring] @Valid List형태로 받으면 안되는 현상 해결방안

by Apère 2023. 2. 28.
반응형
@RestController
@RequestMapping("/test")
public class TestController {

    private final TestService testService;

    @PostMapping("/members")
    public boolean insertMembers(
            @RequestBody @Valid List<MemberDTO> memberList) throws Exception {
        return interlockService.insertMembers(memberList);
    }

위의 코드처럼 @Valid를 통해 유효성체크를 하려고 할때 대상이 List형태이면 동작하지 않습니다

동작이 안되는 이유는  @Valid는 JavaBeans에 적용되는데, List(컬렉션)는 JavaBeans 명세에 포함되지 않기 때문입니다

 

List형태도 유효성 체크를 하는 방법은 여러가지가 있지만 저는 간단하게 Controller에 @Validate 어노테이션을 추가하여 해결하였습니다. 다만 이렇게 되면 @Valid는 MethodArgumentNotValidException 에서 처리하지만 @Validate는 ConstraintViolationException 에서 처리하기 때문에 Exception Handler에서 아래와 같이 추가적으로 처리해줘야합니다

 

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler({ MethodArgumentNotValidException.class })
    public ResponseEntity<Object> handleValid(final MethodArgumentNotValidException ex) {
        HashMap<String, Object> errMap = new HashMap<>();
        FieldError fieldError = ex.getBindingResult().getFieldError();
        if (fieldError !=null) {
            errMap.put("msg",  fieldError.getDefaultMessage());
        } else {
            errMap.put("msg", ex.getMessage());
        }
        return new ResponseEntity<>(errMap, HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler({ ConstraintViolationException.class })
    public ResponseEntity<Object> handleValidList(final ConstraintViolationException ex) {
        HashMap<String, Object> errMap = new HashMap<>();
        errMap.put("msg", ex.getMessage());
        return new ResponseEntity<>(errMap, HttpStatus.BAD_REQUEST);
    }
}

 

반응형

댓글