Biên Dịch : Nguyễn Hoàng Đạt - Lớp Java07
Email : hoangdat3179@gmail.com
Bài viết gốc : https://www.baeldung.com/spring-boot-custom-error-page

1.Tổng quan

Trong bài viết này, chúng ta sẽ xem xét cách tắt và tùy chỉnh trang lỗi mặc định cho ứng dụng Spring Boot vì xử lý lỗi thích hợp mô tả tính chuyên nghiệp và chất lượng công việc.

2. Vô hiệu hóa trang lỗi Whitelabel

Trước tiên, hãy xem cách chúng ta có thể vô hiệu hóa hoàn toàn trang lỗi nhãn trắng, bằng cách đặt thuộc tính server.error.whitelabel.enabled thành false:

server.error.whitelabel.enabled=false

Thêm mục nhập này vào tệp application.properties sẽ vô hiệu hóa trang lỗi và hiển thị một trang ngắn gọn bắt nguồn từ vùng chứa ứng dụng cơ bản, ví dụ: Tomcat.

Chúng ta có thể đạt được kết quả tương tự bằng cách loại trừ ErrorMvcAutoConfiguration bean. Chúng ta có thể làm điều này bằng cách thêm mục nhập này vào tệp thuộc tính:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration

#for Spring Boot 2.0
#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

Hoặc bằng cách thêm chú thích này vào lớp chính:

@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})

Tất cả các phương pháp được đề cập ở trên sẽ vô hiệu hóa trang lỗi nhãn trắng. Điều đó để lại cho chúng ta câu hỏi ai sau đó thực sự xử lý lỗi? Vâng, như đã đề cập ở trên, nó thường là vùng chứa ứng dụng cơ bản. Điều tốt là chúng ta có thể tùy chỉnh thêm mọi thứ bằng cách hiển thị các trang lỗi tùy chỉnh của chúng ta thay vì tất cả các giá trị mặc định - đây là trọng tâm của phần tiếp theo.

3. Hiển thị các trang lỗi tùy chỉnh

Trước tiên chúng ta cần tạo một trang lỗi HTML tùy chỉnh.

Chúng ta sẽ lưu tệp dưới dạng error.html vì chúng ta đang sử dụng công cụ mẫu Thymeleaf:

<!DOCTYPE html>
<html>
<body>
<h1>Something went wrong! </h1>
<h2>Our Engineers are on it</h2>
<a href="/">Go Home</a>
</body>
</html>

Nếu chúng ta lưu tập tin này trong thư mục resources/templates, nó sẽ tự động được chọn bởi BasicErrorController của Spring Boot mặc định.

Đây là tất cả những gì chúng ta cần để hiển thị trang lỗi tùy chỉnh của mình. Với một số kiểu dáng, giờ đây chúng tôi sẽ có một trang lỗi đẹp hơn nhiều cho người dùng của mình:

er404

Chúng tôi có thể cụ thể hơn bằng cách đặt tên tệp bằng mã trạng thái HTTP mà chúng tôi muốn nó được sử dụng, ví dụ: lưu tệp dưới dạng 404.html trong resources/templates/error có nghĩa là nó sẽ được sử dụng rõ ràng cho các lỗi 404.

3.1. Tùy chỉnh ErrorController

Hạn chế cho đến nay là chúng ta không thể chạy logic tùy chỉnh khi xảy ra lỗi. Để đạt được điều đó, chúng ta phải tạo một bean bộ điều khiển lỗi sẽ thay thế bean mặc định.

Đối với điều này, chúng ta phải tạo một lớp thực hiện giao diện ErrorController. Ngoài ra, chúng ta cần đặt thuộc tính server.error.path để trả về đường dẫn tùy chỉnh để gọi khi xảy ra lỗi

@Controller
public class MyErrorController implements ErrorController  {

    @RequestMapping("/error")
    public String handleError() {
        //do something like logging
        return "error";
    }
}

Trong đoạn mã ở trên, chúng ta cũng chú thích lớp bằng @Controller và tạo ánh xạ cho đường dẫn được chỉ định là property server.error.path:

server.error.path=/error

Bằng cách này, bộ điều khiển có thể xử lý các cuộc gọi đến đường dẫn error. Trong handleError(), chúng ta trả về trang lỗi tùy chỉnh mà chúng ta đã tạo trước đó. Nếu chúng ta kích hoạt lỗi 404 ngay bây giờ, đó là trang tùy chỉnh của chúng ta sẽ được hiển thị.

Hãy nâng cao hơn nữa handleError() để hiển thị các trang lỗi cụ thể cho các loại lỗi khác nhau.

Ví dụ: chúng ta có thể có các trang được thiết kế độc đáo dành riêng cho các loại lỗi 404 và 500. Sau đó, chúng ta có thể sử dụng mã trạng thái HTTP của lỗi để xác định một trang lỗi phù hợp để hiển thị:

@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
    Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
    
    if (status != null) {
        Integer statusCode = Integer.valueOf(status.toString());
    
        if(statusCode == HttpStatus.NOT_FOUND.value()) {
            return "error-404";
        }
        else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
            return "error-500";
        }
    }
    return "error";
}

Sau đó, đối với lỗi 404 chẳng hạn, chúng ta sẽ thấy trang error-404.html:

404

4.Kết luận

Qua bài viết này chúng ta đã có thể tạo ra một trang báo lỗi thân thiện với người dùng hơn.