인프런 커뮤니티 질문&답변

인프러너님의 프로필 이미지
인프러너

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

@ControllerAdvice

커스텀 익셉션을 만들어볼려고 합니다.

작성

·

219

2

@Data
@AllArgsConstructor
public class ErrorResult {
    private String code;
    private String message;
    private Map<String, Object> map;
}
@Slf4j
@RestControllerAdvice
public class ExControllerAdvice {

    @ExceptionHandler
    public ResponseEntity<ErrorResult> userExHandler(UserException e, Map<String, Object> map) {
        log.error("[exceptionHandler] ex", e);
        ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage(), map);
        return new ResponseEntity(errorResult, HttpStatus.BAD_REQUEST);
    }

}
public class UserException extends RuntimeException {

    public UserException() {
        super();
    }

    public UserException(String message) {
        super(message);
    }

    public UserException(String message, Throwable cause) {
        super(message, cause);
    }

    public UserException(Throwable cause) {
        super(cause);
    }

    protected UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

이렇게 만들고 컨트롤러에서 사용을 할려고

...
            Map<String, Object> returnMap = new HashMap<>();
            returnMap.put("errorTitle", "titleMsg");
                throw new UserException("ERROR", returnMap);
...

이런식으로 만들었는데
UserException 클래스에서 두 번째 파라미터로 받는 부분이 Throwable 타입이라 오류가 발생되는데..
혹시 두번째 파라미터에 맵이나 리스트나 String등 원하는 값을 받아서 ResponseEneity 타입으로 보내줄려고 하면 어떻게 수정을 해야할까요?

UserException을 아래처럼 수정을 했는데

    public UserException(String message, Map<String, Object> map) {
        super(message);
        this.map = map;
    }

포스트맨으로 테스트를 해 보면 원하는 에러코드가 출력되는게 아니라 기본적인 오류코드가 출력이 되어버리네요..

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 아버지님

UserException 안에 Map으로 데이터를 저장해두고, ExControllerAdvice에서 UserException안에 있는 Map을 꺼내서 활용하시면 됩니다.

감사합니다.

인프러너님의 프로필 이미지
인프러너
질문자

답변 감사합니다.

말씀하신 내용중 Map으로 데이터를 저장해두는게 아래와 같이 map으로 데이터를 받아오는것 말고 다른내용일까요?

    public UserException(String message, Map<String, Object> map) {
        super(message);
        this.map = map;
    }

 

그리고 UserException 안에 있는 Map을 꺼내서 활용한다는게 아래 소스에서 map으로 받아와서 처리를 하는것이 아닐까요??

@Slf4j
@RestControllerAdvice
public class ExControllerAdvice {

    @ExceptionHandler
    public ResponseEntity<ErrorResult> userExHandler(UserException e, Map<String, Object> map) {
        log.error("[exceptionHandler] ex", e);
        ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage(), map);
        return new ResponseEntity(errorResult, HttpStatus.BAD_REQUEST);
    }

}

 

정확하게 어떤내용인지를 이해가 잘 가지 않은데 혹시 조금만 더 자세하게 설명 부탁드려도 될까요?

김영한님의 프로필 이미지
김영한
지식공유자

UserException 안에 Map을 저장해두시고, 예를 들면 다음과 같이 꺼내서 사용하시면 됩니다

    @ExceptionHandler
    public ResponseEntity<ErrorResult> userExHandler(UserException e) {
        log.error("[exceptionHandler] ex", e);
        Map map = e.getMap(); //여기 확인
        ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage(), map);
        return new ResponseEntity(errorResult, HttpStatus.BAD_REQUEST);
    }
인프러너님의 프로필 이미지
인프러너

작성한 질문수

질문하기