본문 바로가기
자바

SptringBoot Rest Api Exception

by 뇽꾸리 2022. 5. 31.
반응형
  • @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 me
	 * @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 me
	 * @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 me
	 * @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 me
	 * @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()
		);
	}

	
}

 

@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);
	}

흠 코드 맘에안듬

반응형

'자바' 카테고리의 다른 글

API 문서 자동화 - Swagger  (0) 2022.08.19
java DTO,VO List 정렬  (0) 2022.08.19
자바 dto,vo 리스트 정렬 list sort  (0) 2022.04.21
string을 VO로 변환, json을 VO로 변환  (0) 2022.01.26
자바 스택/리스트  (0) 2020.06.24

댓글