devNyong
Rest Api Exception 처리 ExceptionAdvice 본문
- @RestControllerAdvice : Exception 발생 시 JSON으로 반환받기 위하여 생성합니다.
- @ExceptionHandler: Bean에서 발생하는 에러를 잡아 처리합니다
전역의 예외를 잡긴하되 패키지 단위로 제한 할 수 도 있다.
@RestControllerAdvice("com.example.demo.login.controller")
@RestControllerAdvice(basePackages = "com.spring2.nyong.api")
@RequiredArgsConstructor
@RestControllerAdvice(basePackages = "com.spring2.nyong.api")
public class ExceptionAdvice {
private final ResponseService responseService;
/**
* default Exception
* @author nyong
* @return CommonResult
* @throws Exception
*/
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
protected CommonResult defaultException(HttpServletRequest request, Exception e) {
return responseService.getFailResult(
HttpStatus.INTERNAL_SERVER_ERROR.value()
, e.getMessage()
);
}
/**
* AccessDeniedException
* @author nyong
* @return CommonResult
* @throws Exception
*/
@ExceptionHandler({ AccessDeniedException.class })
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public CommonResult unauthorizedException(Exception e) {
return responseService.getFailResult(
HttpStatus.UNAUTHORIZED.value()
, e.getMessage()
);
}
/**
* badRequestException
* @author nyong
* @return CommonResult
* @throws Exception
*/
@ExceptionHandler({HttpMessageNotReadableException.class, MethodArgumentNotValidException.class, MissingServletRequestParameterException.class, UnsatisfiedServletRequestParameterException.class})
@ResponseStatus(HttpStatus.BAD_REQUEST)
public CommonResult badRequestException(Exception e)throws Exception {
return responseService.getFailResult(
HttpStatus.BAD_REQUEST.value()
, e.getMessage()
);
}
/**
* forbiddenException
* @author nyong
* @return CommonResult
* @throws Exception
*/
@ExceptionHandler(ForbiddenException.class)
@ResponseStatus(HttpStatus.FORBIDDEN)
public CommonResult forbiddenException(ForbiddenException e) throws Exception {
return responseService.getFailResult(
HttpStatus.FORBIDDEN.value()
, e.getMessage()
);
}
}
resultModel은 따로 코드를 안올렸는데 정말 구글에 검색하면 나온다.
심지어 서비스나 controllerAdvice는 조금씩 달라도 모델은 진짜 모두가 한마음 한뜻인지 다 똑같음 commonResult 검색 하면 다 똑같은 코드가 많이 나온다.
@Service
public class ResponseService {
@Getter
@RequiredArgsConstructor
@AllArgsConstructor
// enum으로 API 요청 결과에 대한 status, message를 정의한다.
public enum CommonResponse {
SUCCESS(200, "SUCCESS",new HashMap<String,Object>()),
FAIL(500, "FAIL",new HashMap<String,Object>());
private int status; // http 코드값
private String msg; // message
private Map<String,Object> data;
}
// 단일건 결과를 처리하는 메소드
public <T> SingleResult<T> getSingleResult(T data, int status, String msg) {
SingleResult<T> result = new SingleResult<>();
result.setData(data);
setSuccessResult(result, status, msg);
return result;
}
// 다중건 결과를 처리하는 메소드
public <T> ListResult<T> getListResult(List<T> list, int status, String msg) {
ListResult<T> result = new ListResult<>();
result.setList(list);
setSuccessResult(result, status, msg);
return result;
}
// 성공 결과만 처리하는 메소드
public JsonResult getSuccessResult() { // CommonResult 응답 결과를 알려주는 클래스
JsonResult result = new JsonResult();
result.setData(CommonResponse.SUCCESS.getData());
setSuccessResult(result);
return result;
}
// 실패 결과만 처리하는 메소드
public JsonResult getFailResult(int status, String msg) {
JsonResult result = new JsonResult();
result.setSuccess(false);
result.setStatus(status);
result.setMsg(msg);
result.setData(CommonResponse.FAIL.getData());
return result;
}
// 결과 모델에 API 요청 성공 데이터를 세팅해주는 메소드
private void setSuccessResult(CommonResult result) {
result.setSuccess(true);
result.setStatus(CommonResponse.SUCCESS.getStatus());
result.setMsg(CommonResponse.SUCCESS.getMsg());
}
// 결과 모델에 API 요청 성공 데이터를 세팅해주는 메소드
private void setSuccessResult(CommonResult result, int status, String msg) {
result.setSuccess(true);
result.setStatus(status);
result.setMsg(msg);
}
요즘들어 return 결과값이 일정하면 좋겠어서 성공이든 실패든 요형태로 리턴하려고 만들었다.
근데 뭔가 코드가 맘에안든다
{
status :
message :
data :
}
'springboot' 카테고리의 다른 글
[Oracle] mybatis 날짜 조회 (0) | 2022.10.07 |
---|---|
스프링 서버 경로 구하기 (0) | 2022.06.15 |
[ SpringBoot ] api test , jpa test 코드 (0) | 2022.05.18 |
Comments