티스토리 뷰

 

▶️ 해당 reqeust 파일이 있다고 해보자. 

내가 만약 [ tripName ]을 입력하지 않았다면, 사용자에게 해당 [ message ]를 출력하고 싶다. 

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TripRequest {

    @NotNull(message = "여행 이름을 입력하세요.")
    private String tripName;

    @NotNull(message = "출발 날짜를 입력하세요.")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;

    @NotNull(message = "도착 날짜를 입력하세요.")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;

    @NotNull(message = "국내 여행 여부를 입력하세요.")
    private Boolean isDomestic;
}

 

 

▶️ @Valid 를 통한 예외는 [ MethodArgumentNotValidException ] 이다.

 

 

 

# step 1 일단 예외 처리 핸들러를 작성하자. 

@ExceptionHandler(value = {MethodArgumentNotValidException.class})
    public ResponseEntity<ErrorResponseDTO> handleArgumentNotVaildException(
            MethodArgumentNotValidException e, HttpServletRequest request
    ) {
        return new ResponseEntity<>(
                ErrorResponseDTO.error(e),
                HttpStatus.BAD_REQUEST
        );
    }

 

 

# step 2 ErrorResponseDTO.error() 메소드 작성

    public static ErrorResponseDTO error(MethodArgumentNotValidException e) {
        return new ErrorResponseDTO(
                BAD_REQUEST.getStatus(), BAD_REQUEST.getCode(), e.getMessage()
        );   
    }

 

 

# step 3 TEST

 

 

 

뭐지? 

일단 구글링 

 

 

# step 4. 

이 예외에서 에러들을 뽑아내어, dafaultMessage인것만 뽑아내어 묶으면 된다. 

List인 이유 -> 예외가 여러개일수도 있어서. 

    public static ErrorResponseDTO error(MethodArgumentNotValidException e) {
        List<String> msgList = e.getAllErrors().stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.toList());

        return new ErrorResponseDTO(
                BAD_REQUEST.getStatus(), BAD_REQUEST.getCode(), String.join(",", msgList)
        );
    }

 

 

🌟 결과