반응형
@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);
}
}
반응형
'Spring' 카테고리의 다른 글
[Spring] Springdoc을 이용한 Swagger 적용 (0) | 2023.03.02 |
---|---|
[Spring] MapStruct를 이용한 DTO <-> Entity 사용시 조인관계 매핑 (0) | 2023.03.01 |
[Spring] @PostConstruct 활용한 초기 설정 (0) | 2023.02.27 |
[Spring] Jasypt 사용시 @DataJpaTest 에러 (0) | 2023.02.24 |
[Spring] mapstruct를 이용한 DTO <-> Entity 변환 (0) | 2023.02.22 |
댓글