[Spring boot + Rest API] Handle Exception
Java
164
spring boot
76
REST API
10
White

xoandaica viết ngày 05/02/2019

1. Overview

Exception trong spring có thể được xử lý bằng nhiều cách. Trong phạm vi bài này m sẽ giới thiệu đến các bạn một vài cách xử lý tương đối cơ bản

  • Sử dụng annotation @ExceptionHandler
  • Sử dung HandlerExceptionResolver
  • Sử dụng annotation @ControllerAdvice

    2. ExceptionHandler

    Có thể sử dụng annotation này nhằm mục đích đánh dấu method nào sẽ xử lý exception cụ thể nào trong controller
    VD:

    @GetMapping(path = "/car/{id}")
    public String getCar(@PathVariable("id") int id) {
        switch (id) {
            case 1:
                throw new CarNotFoundException();
            default:
                return "Day la car n";
        }
    }
    
    @ExceptionHandler({CarNotFoundException.class})
    public void handleCarException(CarNotFoundException e) {
        System.out.println(e.getMessage());        
    }
    

    Như các bạn đã thấy, method handleCarException được sử dụng để xử lý các exception xảy ra trong restapi getCar. Cách sử dụng này có một khuyết điểm là chỉ sử dụng trong ngữ cảnh controller cụ thể, không mang tính global được.

    3. HandlerExceptionResolver

    Bản thân spring đã có một vài cài đặt của handlerExceptionResolver. Cụ thể:

  • ExceptionHandlerExceptionResolver được setup thông qua annotation @ExceptionHandler

  • ResponseStatusExceptionResolver được setup thông qua annotation @ResponseStatus
    Ngoài ra spring còn cung cấp một lớp AbstractHandlerExceptionResolver cho phép chung ta tự custom một handlerExceptionResolver của ứng dụng mình

@Component
public class MyHandlerExceptionResolve extends AbstractHandlerExceptionResolver {

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        try {
            if (ex instanceof HomeNotFoundException) {
                // do something with error
            }
        } catch (Exception handlerException) {
        }
        return new ModelAndView("error");
    }
}

4. ControllerAdvice

Giải pháp này đến từ spring AOP. M sẽ có một topic nói về project này. Bạn cứ hiểu nôm na đó là lập trình hướng khía cạnh. Thay vì quan tâm đến việc cụ thẻ hóa các sự vật sự việc trong đời sống như OOP thì AOP quan tâm đến một khía cạnh của vấn đề, Ví dụ: Logging, Handler Exception.....
Với các làm này, bạn có thể bốc nguyên logic xử lý exception ra một class riêng.

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(CarNotFoundException.class)
    protected ResponseEntity<ApiError> handleEntityNotFound(
            CarNotFoundException ex) {
        ApiError apiError = new ApiError(NOT_FOUND);
        apiError.setMessage(ex.getMessage());
        return buildResponseEntity(apiError);
    }

    private ResponseEntity<ApiError> buildResponseEntity(ApiError apiError) {
        return new ResponseEntity<>(apiError, apiError.getStatus());
    }

    @Override
    protected ResponseEntity<Object> handleAsyncRequestTimeoutException(AsyncRequestTimeoutException ex, HttpHeaders headers, HttpStatus status, WebRequest webRequest) {
        return super.handleAsyncRequestTimeoutException(ex, headers, status, webRequest); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    protected ResponseEntity<Object> handleHttpMediaTypeNotAcceptable(HttpMediaTypeNotAcceptableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        return super.handleHttpMediaTypeNotAcceptable(ex, headers, status, request); //To change body of generated methods, choose Tools | Templates.
    }

}

Ở đây m có sử dụng đến một class ResponseEntityExceptionHandler. về cơ bản thằng này giống thằng AbstractHandlerExceptionResolver. Đều cung cấp các method cho phép ta xử lý exception. nhưng anh chàng này thay vì trả về ModelAndView thì trả về ResponseEntity.
Ngoài những method đã được định nghĩa sẵn, bạn có thể kết hợp với @ExceptionHandler như đã giới thiệu ở phần 1 để xây dựng cho mình cơ chế xử lý exception tiện lợi nhất.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

xoandaica

14 bài viết.
10 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
4 0
Bài viết này sẽ hướng dẫn các bạn từng bước xây dựng một ứng dụng java sử dụng spring boot kết hợp với spring data jdbc để lưu trữ và nhận dữ liệu ...
xoandaica viết hơn 1 năm trước
4 0
White
3 0
1. Các cách để xây dựng rest api trong spring Để xây dựng rest api trong spring có thể sử dụng nhiều cách. Phổ biến nhất là 3 cách dưới đây 1. S...
xoandaica viết hơn 1 năm trước
3 0
White
2 0
1. Single Thread 1. Làm một việc tại một thời điểm Không giống như đa số các ngôn ngữ lập trình khác, javascript đơn giản là đơn luồng. Điều này ...
xoandaica viết hơn 1 năm trước
2 0
Bài viết liên quan
White
0 0
Trong bài viết này, một số hình ảnh hoặc nọi dung có thể bị thiếu do quá trình chế bản. Vui lòng xem nội dung ở blog gốc sau: (Link) (Link), chúng...
programmerit viết 5 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
14 bài viết.
10 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!