Để nhận và xử lý exception trong restfull api java spring, bạn có thể sử dụng một trong hai cách sau:
Cách 1: Sử dụng annotation @ExceptionHandler
Đây là cách phổ biến nhất để xử lý exception trong restfull api java spring. Để sử dụng cách này, bạn cần thêm annotation @ExceptionHandler()
vào controller của bạn. Annotation này sẽ chỉ định phương thức nào sẽ được gọi khi một exception cụ thể được ném ra.
Ví dụ:
@RestController public class CustomerController {
@ExceptionHandler(CustomerNotFoundException.class)
public ResponseEntity<ErrorResponse> handleCustomerNotFoundException(CustomerNotFoundException exception) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setCode(404); errorResponse.setMessage(exception.getMessage()); return ResponseEntity.status(404).body(errorResponse);
} @GetMapping("/customers/{id}")
public Customer getCustomerById(@PathVariable Long id) { if (id == 1) { throw new CustomerNotFoundException("Customer with id 1 does not exist"); } return new Customer();
}
}
Trong ví dụ này, chúng ta sử dụng annotation @ExceptionHandler()
để chỉ định phương thức handleCustomerNotFoundException()
sẽ được gọi khi một exception CustomerNotFoundException
được ném ra. Phương thức này sẽ trả về một phản hồi HTTP với mã lỗi 404 và thông báo lỗi.
Cách 2: Sử dụng annotation @ControllerAdvice
Nếu bạn cần xử lý nhiều exception khác nhau trong controller của mình, bạn có thể sử dụng annotation @ControllerAdvice
. Annotation này sẽ tạo ra một lớp chứa các phương thức @ExceptionHandler()
.
Ví dụ:
@ControllerAdvice public class GlobalExceptionHandler {
@ExceptionHandler(CustomerNotFoundException.class)
public ResponseEntity<ErrorResponse> handleCustomerNotFoundException(CustomerNotFoundException exception) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setCode(404); errorResponse.setMessage(exception.getMessage()); return ResponseEntity.status(404).body(errorResponse);
} @ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleGenericException(Exception exception) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setCode(500); errorResponse.setMessage(exception.getMessage()); return ResponseEntity.status(500).body(errorResponse);
}
}
Trong ví dụ này, chúng ta sử dụng annotation @ControllerAdvice()
để tạo ra một lớp GlobalExceptionHandler
chứa hai phương thức @ExceptionHandler()
. Phương thức đầu tiên sẽ xử lý exception CustomerNotFoundException
, còn phương thức thứ hai sẽ xử lý tất cả các exception khác.
Cách trả về phản hồi HTTP
Khi xử lý exception trong restfull api java spring, bạn cần trả về một phản hồi HTTP với mã lỗi phù hợp. Mã lỗi HTTP tiêu chuẩn được sử dụng để chỉ định loại lỗi đã xảy ra. Ví dụ:
- Mã lỗi 400 được sử dụng cho lỗi phía client, chẳng hạn như tham số không hợp lệ.
- Mã lỗi 401 được sử dụng cho lỗi không được phép, chẳng hạn như người dùng không có quyền truy cập vào tài nguyên.
- Mã lỗi 403 được sử dụng cho lỗi bị cấm, chẳng hạn như người dùng cố gắng truy cập một tài nguyên bị cấm.
- Mã lỗi 404 được sử dụng cho lỗi không tìm thấy, chẳng hạn như tài nguyên không tồn tại.
- Mã lỗi 500 được sử dụng cho lỗi phía server.