[Thực hành] Sử dụng ExceptionHandler để xử lý ngoại lệ cho ứng dụng Quản lý Khách hàng

9.AOP

Mục tiêu

Thực hành sử dụng ExceptionHandler để xử lý các ngoại lệ nghiệp vụ.

Nội dung

Bổ sung các xử lý ngoại lệ cho dự án quản lý danh sách khách hàng.

Hướng dẫn

Bước 1: thực hiện các bước cài đặt và khởi động dự án.

Tải dự án tại file đính kèm.

Bước 2: bổ sung ngoại lệ nghiệp vụ

Đặt vấn đề rằng email của các khách hàng không được trùng nhau:

@Column(unique = true)
private String email;

Cập nhật entity customer như trên và khởi động lại application để Hibernate cập nhật DDL của bảng trong database. Có thể sẽ phải bổ sung ràng buộc unique bằng cách can thiệp trực tiếp vào database:

Sử dụng chương trình để thử cập nhật thông tin khách hành thành có email trùng, và xác nhận rằng DataIntegrityViolationException xuất hiện trên view của người dùng. Đây là việc không mong muốn.

Tạo class exception trong package service để xử lý exception này:

package cg.wbd.grandemonstration.service.exception;

public class DuplicateEmailException extends Exception {
}

Cập nhật service để xử lý DataIntegrityViolationException:

@Override
public Customer save(Customer customer) throws DuplicateEmailException {
try {
return customerRepository.save(customer);
} catch (DataIntegrityViolationException e) {
throw new DuplicateEmailException();
}
}

Tới đây, service save customer đã có một ngoại lệ nghiệp vụ là DuplicateEmailException.

Bước 3: xử lý ngoại lệ nghiệp vụ

Bổ sung một view báo lỗi cho trường hợp dữ liệu đầu vào không phù hợp, giả sử đặt tại customers/inputs-not-acceptable.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Error</title>
</head>
<body>
Inputs are not acceptable. Please try again!
</body>
</html>

Sử dụng một khối try/catch tại controller để xử lý ngoại lệ trùng email của service:

@PostMapping
public ModelAndView updateCustomer(Customer customer) {
try {
customerService.save(customer);
return new ModelAndView("redirect:/customers");
} catch (DuplicateEmailException e) {
return new ModelAndView("customers/inputs-not-acceptable");
}
}

Kiểm thử lại chương trình để xem kết quả.

Bước 3: sử dụng ExpectionHandler

Sử dụng khối try/catch khiến cho handle method của controller phải làm 2 việc. Mã xấu này có thể được khử bằng cách sử dụng annotation ExceptionHandler. Trước tiên, handler method không xử lý catch nữa:

@PostMapping
public ModelAndView updateCustomer(Customer customer) throws DuplicateEmailException {
customerService.save(customer);
return new ModelAndView("redirect:/customers");
}

Sau đó, tạo một handle method khác, đi kèm với annotation ExceptionHandler, và mô tả thêm thông tin “exception nào sẽ được method này xử lý”:

@ExceptionHandler(DuplicateEmailException.class)
public ModelAndView showInputNotAcceptable() {
return new ModelAndView("customers/inputs-not-acceptable");
}

Kiểm thử lại chương trình để xác nhận kết quả.

Bạn rút ra kết luận gì về tính năng của @ExceptionHandler?

cms.zip cms.zip 

Leave a Reply

Your email address will not be published. Required fields are marked *