Exception handling trong Spring Boot

0 phút đọc

Xử lý ngoại lệ (Exception handling) là một phần quan trọng của việc phát triển ứng dụng, bao gồm cả việc xây dựng các Restful API trong Spring Boot. Trong bài viết này, chúng ta sẽ tìm hiểu về cách xử lý ngoại lệ trong Spring Boot bằng cách sử dụng các chú thích quan trọng như @RestControllerAdvice, @ControllerAdvice, và @ExceptionHandler. Các ví dụ sẽ được thực hiện bằng ngôn ngữ Java để giúp bạn hiểu rõ hơn.

Giới Thiệu

Trong việc phát triển các Restful API, có nhiều tình huống mà bạn cần kiểm soát, ví dụ như khi người dùng yêu cầu thông tin của một đối tượng không tồn tại. Trong trường hợp như vậy, chúng ta không muốn ứng dụng gửi về cho người dùng một lỗi hệ thống mà thay vào đó muốn trả về một thông báo lỗi thân thiện hơn.

@RestControllerAdvice & @ControllerAdvice + @ExceptionHandler

  • @RestControllerAdvice là một Annotation được áp dụng trên một class và thường được sử dụng cùng với @ExceptionHandler. Nó can thiệp vào việc xử lý của các @RestController.

  • @ControllerAdvice là một Annotation tương tự như @RestControllerAdvice, nhưng thường được sử dụng cùng với @ExceptionHandler để can thiệp vào việc xử lý của các Controller thông thường.

@RestControllerAdvice@ControllerAdvice thường được kết hợp với @ExceptionHandler để xử lý ngoại lệ.

@RestControllerAdvice
public class ApiExceptionHandler {

    @ExceptionHandler(IndexOutOfBoundsException.class)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public ErrorMessage todoException(Exception ex, WebRequest request) {
        return new ErrorMessage(10100, "Đối tượng không tồn tại");
    }
}

Trong ví dụ trên, chúng ta đã sử dụng @RestControllerAdvice@ExceptionHandler để xử lý ngoại lệ IndexOutOfBoundsException. Khi một ngoại lệ này xảy ra trong một Rest Controller, Spring Boot sẽ gọi phương thức todoException và trả về một thông báo lỗi thân thiện hơn với HTTP status code là BAD_REQUEST.

@ResponseStatus

@ResponseStatus cho phép bạn định nghĩa HTTP status code mà bạn muốn trả về cho người dùng. Bạn có thể sử dụng nó trên một đối tượng được trả về từ một phương thức. Nếu bạn không muốn sử dụng ResponseEntity, bạn có thể sử dụng @ResponseStatus.

Demo

Cài Đặt

Chúng ta sẽ tạo một ứng dụng Spring Boot đơn giản để minh họa việc xử lý ngoại lệ.

Thêm Dependency

Chúng ta cần thêm dependency cho Spring Boot Web trong file pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Tạo Model

Chúng ta sẽ tạo một đối tượng Todo và một đối tượng ErrorMessage:

@Data
@AllArgsConstructor
public class Todo {
    private String title;
    private String detail;
}

@Data
@AllArgsConstructor
public class ErrorMessage {
    private int statusCode;
    private String message;
}

Tạo Rest Controller

Chúng ta sẽ tạo một Rest Controller đơn giản:

@RestController
@RequestMapping("/api/v1")
public class RestApiController {

    private List<Todo> todoList;

    @PostConstruct
    public void init() {
        todoList = IntStream.range(0, 10)
                 .mapToObj(i -> new Todo("title-" + i, "detail-" + i))
                 .collect(Collectors.toList());
    }

    @GetMapping("/todo/{todoId}")
    public Todo getTodo(@PathVariable(name = "todoId") Integer todoId) {
        return todoList.get(todoId);
    }
}

Tạo Exception Handler

Chúng ta sẽ tạo một Exception Handler để xử lý ngoại lệ IndexOutOfBoundsException:

@RestControllerAdvice
public class ApiExceptionHandler {

    @ExceptionHandler(IndexOutOfBoundsException.class)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public ErrorMessage todoException(Exception ex, WebRequest request) {
        return new ErrorMessage(10100, "Đối tượng không tồn tại");
    }
}

Chạy Thử

Chúng ta có thể chạy ứng dụng Spring Boot và gửi một request đến địa chỉ sau:

GET http://localhost:8080/api/v1/todo/11

Ở đây, đối tượng có `todoId

là 11 không tồn tại trong danh sách, và chúng ta sẽ nhận được một thông báo lỗi thân thiện hơn với HTTP status code làBAD_REQUEST`.

Kết quả
{
"statusCode": 10100,
"message": "Đối tượng không tồn tại"
}
Avatar TechMely Team
Được viết bởi

TechMely Team

Bạn cần sức mạnh, nghị lực nên cuộc sống đã đặt ra những khó khăn nghịch cảnh để bạn vượt qua và trở nên mạnh mẽ hơn.