Khóa học spring-boot

Tự tạo Validator để kiểm tra Model và Entity

0 phút đọc

Hibernate và Java đã cung cấp cho chúng ta nhiều Annotation để kiểm tra dữ liệu của model. Nhưng đôi khi, chúng ta cần kiểm tra các điều kiện cụ thể phù hợp với logic kinh doanh của dự án. Để làm điều này, chúng ta có thể tự tạo Validator riêng cho mình. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách tự tạo Validator bằng Hibernate Validator và Spring Boot.

Cài đặt

Trước khi tạo Validator, chúng ta cần chuẩn bị một số thành phần cơ bản.

Tạo Model

Chúng ta sẽ sử dụng một model đơn giản là User như sau:

@Data
public class User {
    private String kungfutechId;
}

Tạo Controller

Chúng ta cần một Controller để giao tiếp với client:

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

    @PostMapping
    public Object createUser(@Valid @RequestBody User user) {
        return user;
    }
}

Cài đặt Hibernate Validator

Chúng ta cần thêm Hibernate Validator vào Maven pom.xml:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.0.Final</version>
</dependency>

Tạo Annotation

Định nghĩa Annotation

Đầu tiên, chúng ta cần định nghĩa một Annotation mới. Trong ví dụ này, chúng ta sẽ tạo Annotation @KungfutechId để kiểm tra tính hợp lệ của trường kungfutechId:

@Documented
@Constraint(validatedBy = KungfutechIdValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface KungfutechId {
    String message() default "KungfutechId must start with kungfutech://";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Gắn Annotation lên Model

Bây giờ, chúng ta có thể gắn @KungfutechId lên trường cần kiểm tra tính hợp lệ trong model User:

@Data
public class User {
    @KungfutechId
    private String kungfutechId;
}

Tạo Validator

Sau khi đã tạo Annotation, chúng ta cần tạo một Validator để kiểm tra tính hợp lệ của trường dựa trên @KungfutechId. Validator này sẽ kiểm tra xem trường kungfutechId có bắt đầu bằng chuỗi "kungfutech://" hay không.

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class KungfutechIdValidator implements ConstraintValidator<KungfutechId, String> {
    private static final String KUNGFUTECH_PREFIX = "kungfutech://";

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (s == null || s.isEmpty()) return false;

        return s.startsWith(KUNGFUTECH_PREFIX);
    }
}

Chạy thử

Bây giờ, chúng ta có thể thực hiện kiểm tra tính hợp lệ của trường kungfutechId trong User thông qua @KungfutechId Annotation. Dưới đây là kết quả của việc chạy thử các request:

Request một User hợp lệ

Request:

{
  "kungfutechId": "kungfutech://user_1"
}

Kết quả (200 OK):

{
  "kungfutechId": "kungfutech://user_1"
}

Request một User không hợp lệ:

Request:

{
  "kungfutechId": "Laula://user_1"
}

Kết quả (400 Bad Request):

{
  "timestamp": "2019-12-19T10:26:14.554+0000",
  "status": 400,
  "error": "Bad Request",
  "errors": [
    {
      "codes": [
        "KungfutechId.user.kungfutechId",
        "KungfutechId.kungfutechId",
        "KungfutechId.java.lang.String",
        "KungfutechId"
      ],
      "arguments": [
        {
          "codes": ["user.kungfutechId", "kungfutechId"],
          "arguments": null,
          "defaultMessage": "kungfutechId",
          "code": "kungfutechId"
        }
      ],
      "defaultMessage": "KungfutechId must start with kungfutech://",
      "objectName": "user",
      "field": "kungfutechId",
      "rejectedValue": "Laula://user_1",
      "bindingFailure": false,
      "code": "KungfutechId"
    }
  ],
  "message": "Validation failed for object='user'. Error count: 1",
  "path": "/api/v1/users"
}

Tóm tắt

Việc tự tạo Validator cho model và entity trong ứng dụng Spring Boot sử dụng Hibernate Validator rất đơn giản và mạnh mẽ. Bằng cách sử dụng Annotation và Validator tùy chỉnh, bạn có thể kiểm tra tính hợp lệ của dữ liệu dựa trên logic kinh doanh của dự án một cách dễ dàng và hiệu quả. Điều này giúp bảo đảm tính toàn vẹn của dữ liệu và cải thiện chất lượng của ứng dụng của bạn.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Entity Framework là gì?

entry

What is the highest level in the object model?

entry

Explain what is ORM (Object-Relationship-Model) in Rails?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào