ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [RestFul 학습] - EXCEPTION관리
    SPRING/WEBSERVICE 2020. 5. 28. 23:50

    Rest Api에서 아래와 같이 id에 따른 List를 불러오려고 할 때 user 값이 존재하지 않으면 Exception을 일으키는 방식으로 response 를 내려줄 수 있다.

    // GET /users/1 or /users/10 -> String 
    	@GetMapping("/users/{id}")
    	public User retrieveUser(@PathVariable int id) {
    		User user =service.findOne(id);
    		if (user == null) {
    			throw new UserNotFoundException(String.format("ID[%s] not found", id));
    		}
    		
    		return user;
    	}

    아래와 같이 @ResponseStatus에 404 코드를 세팅하면 Http response code를 404로 내려주는 것이 가능하다.

    @ResponseStatus(HttpStatus.NOT_FOUND)
    public class UserNotFoundException extends RuntimeException {
    
    	public UserNotFoundException(String message) {
    		super(message);
    		// TODO Auto-generated constructor stub
    	}
    
    }

    아래와 같이 @Controller 전체에서 Exception을 잡아주는 @ControllerAdvice를 사용하면 예외 발생시 캐치하여 처리할  수 있다.  이떄 ResponseEntityExceptionHandler를 사용하도록 한다.

     

    UserNotFoundException 클래스의 ExcetionHandler를 이용하여 아래와 같이 ExceptionResponse 를 내려줄 수있다.

    (JSON방식)

    이러한 방식으로 Exception들은 한 클래스에서 관리할 수가 있다.

    @RestController
    @ControllerAdvice
    public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler{
    
    	
    	@ExceptionHandler(Exception.class)
    	public final ResponseEntity<Object> handleAllExcetipon(Exception ex, WebRequest request) {
    		System.out.println("Exception...");
    		ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
    		return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    	}
    	
    	@ExceptionHandler(UserNotFoundException.class)
    	public final ResponseEntity<Object> handleUserNotFoundException(Exception ex, WebRequest request) {
    		ExceptionResponse exceptionResponse =
    				new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
    		
    		return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND);
    	}
    }
    

    ExceptionResponse class :

     

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class ExceptionResponse {
    
    	private Date timestamp;
    	private String message;
    	private String details;
    	
    }
    

     

    결과 :

     

Designed by Tistory.