오늘 강의 진행하면서 html과 json 요청에 대해 error 처리를 다르게 하고 싶다는 요구가 있었다. Header에서 Accept 값을 추출하고 별짓을 다했는데 다음과 같이 각 요청에 따라 분리처리하면 되겠다.
html 요청의 경우 Controller 애노테이션을 사용하고 json 요청 처리를 위해 RestController를 사용한다면 다음과 같이 @ControllerAdvice를 설정함으로써 가능하겠다.
@ControllerAdvice(annotations = Controller.class)
public class SecurityControllerAdvice {
private static final Logger log = LoggerFactory.getLogger(SecurityControllerAdvice.class);
@ExceptionHandler(UnAuthenticationException.class)
@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
public String unAuthentication() {
log.debug("UnAuthenticationException is happened!");
return "/user/login";
}
}
json 요청의 경우 경우 RestController로 제한
@RestControllerAdvice(annotations = RestController.class)
public class RestSecurityControllerAdvice {
private static final Logger log = LoggerFactory.getLogger(RestSecurityControllerAdvice.class);
@ExceptionHandler(UnAuthenticationException.class)
@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
public ErrorMessage unAuthentication(UnAuthenticationException e) {
log.debug("JSON API UnAuthenticationException is happened!");
return new ErrorMessage(e.getMessage());
}
}
위와 같이 처리하거나 다음과 같이 Accept Header를 활용한 처리도 가능하다.
@ControllerAdvice
@RequestMapping(produces = "application/vnd.error+json")
public class PersonControllerAdvice {
}
Global exception handling with @ControllerAdvice 문서를 참고하면 패키지로 제한하는 등의 더 다양한 설정을 볼 수 있다.
그나 저나 이 문서와 설정은 이전에도 봤던 것 같은데 오늘 아무리 찾아도 찾을 수 없었다. 아무래도 늙어가는 징조인 듯하다.
0개의 의견 from SLiPP
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.