天天看點

使用Hibernate Validator校驗接口入參并使用自定義校驗器

Hibernate Validator是用來做什麼的?

JSR-303 是 JAVA EE 6 中的一項子規範,叫做 Bean Validation,用于對 Java Bean 中的字段的值進行驗證。Hibernate Validator則是Hibdernate提供的一種對該規範的實作。

——即Hibernate Validator是用來做參數校驗。

使用Hibernate Validator提供的注解進行參數校驗

引入依賴

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

Hibernate Validator常用注解

注解 釋義
@Null 必須為null
@NotNull 不能為null
@AssertTrue 必須為true
@AssertFalse 必須為false
@Min 必須為數字,其值大于或等于指定的最小值
@Max 必須為數字,其值小于或等于指定的最大值
@DecimalMin 必須為數字,其值大于或等于指定的最小值
@DecimalMax 必須為數字,其值小于或等于指定的最大值
@Size 集合的長度
@Digits 必須為數字,其值必須再可接受的範圍内
@Past 必須是過去的日期
@Future 必須是将來的日期
@Pattern 必須符合正規表達式
@Email 必須是郵箱格式
@Length 長度範圍
@NotEmpty 不能為null,長度大于0
@Range 元素的大小範圍
@NotBlank 不能為null,字元串長度大于0(限字元串)

建立測試類

注意必須先進行為null判斷,否則其他注解有的不會生效。

比如username加了@Length而不加@NotNull注解,當沒有輸入username,那麼@Length判斷将不會生效,判斷為null的有@NotNull、@NotEmpty以及@NotBlank

建議自行去掉@NotNull再測試一下

package com.dfyang.validator.entity;

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;

public class User {
    @NotBlank(message = "名稱不能為空")
    private String name;

    @Range(min = 1, max = 120, message = "年齡必須為1-120歲")
    private Integer age;

    @NotBlank(message = "描述不能為空")
    private String description;

    @NotNull
    @Length(min = 6, max = 18, message = "使用者名長度必須為6-18位")
    private String username;

    @NotNull
    @Length(min = 6, max = 18, message = "密碼長度必須為6-18位")
    private String password;

	/** get、set方法 */
}
           

建立測試Controller

@Valid用在參數上,表示對該參數進行校驗。

如果對參數校驗發現有誤,會将錯誤注入到BindingResult中

我們這裡将錯誤進行列印,也可以直接抛出異常

package com.dfyang.validator.controller;

import com.dfyang.validator.entity.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
public class UserController {

    @GetMapping("/insert")
    @ResponseBody
    public User insertUser(@Valid User user, BindingResult result) {
        if (result.hasErrors()) {
            for (ObjectError error : result.getAllErrors()) {
                System.err.println(error.getDefaultMessage());
            }
        }
        return user;
    }
}
           

輸入 http://localhost:8080/insert?name=張三&descripyion=&age=0&username=123123

使用Hibernate Validator校驗接口入參并使用自定義校驗器

使用自定義校驗器進行參數校驗

建立自定義注解,用于判斷年齡是否符合限制

package com.dfyang.validator.constraint;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 性别限制
 */
@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = SexConstraintValidator.class)
public @interface Sex {

    String message() default "性别有誤";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}
           

判斷注解的值是否符合限制,這裡進行了為null判斷,也可以不進行在多加一個@NutNull

package com.dfyang.validator.constraint;

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

/**
 * 性别限制邏輯判斷
 */
public class SexConstraintValidator implements ConstraintValidator<Sex, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && (value.equals("男") || value.equals("女"));
    }
}
           

@Target用于指定使用範圍,該處限定隻能在字段上使用

@Retention(RetentionPolicy.RUNTIME)表示注解在運作時可以通過反射擷取到

@Constraint(validatedBy = xxx.class)指定該注解校驗邏輯

2.建立校驗實體,使用Hibernate Validator自帶注解以及自定義的注解

package com.dfyang.validator.entity;

import com.dfyang.validator.constraint.Sex;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

public class User {
    @NotBlank(message = "名稱不能為空")
    private String name;

    @Range(min = 1, max = 120, message = "年齡必須為1-120歲")
    private Integer age;

    @Sex
    private String sex;

    @NotBlank(message = "描述不能為空")
    private String description;

    @NotNull(message = "使用者名不能為空")
    @Length(min = 6, max = 18, message = "使用者名長度必須為6-18位")
    private String username;

    @NotNull(message = "密碼不能為空")
    @Length(min = 6, max = 18, message = "密碼長度必須為6-18位")
    private String password;
	
	/** 省略get、set */
}
           
使用Hibernate Validator校驗接口入參并使用自定義校驗器