Hibernate validator使用以及自定義校驗(yàn)器注解
JSR-303 是 JAVA EE 6 中的一項(xiàng)子規(guī)范,叫做 Bean Validation,用于對 Java Bean 中的字段的值進(jìn)行驗(yàn)證。Hibernate Validator則是Hibdernate提供的一種對該規(guī)范的實(shí)現(xiàn)。
——即Hibernate Validator是用來做參數(shù)校驗(yàn)。
使用Hibernate Validator提供的注解進(jìn)行參數(shù)校驗(yàn)
| 注解 | 釋義 |
|---|---|
| @Null | 必須為null |
| @NotNull | 不能為null |
| @AssertTrue | 必須為true |
| @AssertFalse | 必須為false |
| @Min | 必須為數(shù)字,其值大于或等于指定的最小值 |
| @Max | 必須為數(shù)字,其值小于或等于指定的最大值 |
| @DecimalMin | 必須為數(shù)字,其值大于或等于指定的最小值 |
| @DecimalMax | 必須為數(shù)字,其值小于或等于指定的最大值 |
| @Size | 集合的長度 |
| @Digits | 必須為數(shù)字,其值必須再可接受的范圍內(nèi) |
| @Past | 必須是過去的日期 |
| @Future | 必須是將來的日期 |
| @Pattern | 必須符合正則表達(dá)式 |
| 必須是郵箱格式 | |
| @Length | 長度范圍 |
| @NotEmpty | 不能為null,長度大于0 |
| @Range | 元素的大小范圍 |
| @NotBlank | 不能為null,字符串長度大于0(限字符串) |
引入依賴
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.15.Final</version> </dependency>
Hibernate Validator常用注解
創(chuàng)建測試類
注意必須先進(jìn)行為null判斷,否則其他注解有的不會生效。
比如username加了@Length而不加@NotNull注解,當(dāng)沒有輸入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方法 */
}
創(chuàng)建測試Controller
@Valid用在參數(shù)上,表示對該參數(shù)進(jìn)行校驗(yàn)。
如果對參數(shù)校驗(yàn)發(fā)現(xiàn)有誤,會將錯誤注入到BindingResult中
我們這里將錯誤進(jìn)行打印,也可以直接拋出異常
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

使用自定義校驗(yàn)器進(jìn)行參數(shù)校驗(yàn)
創(chuàng)建自定義注解,用于判斷年齡是否符合約束
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 { };
}
判斷注解的值是否符合約束,這里進(jìn)行了為null判斷,也可以不進(jìn)行在多加一個@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)表示注解在運(yùn)行時可以通過反射獲取到
@Constraint(validatedBy = xxx.class)指定該注解校驗(yàn)邏輯
2.創(chuàng)建校驗(yàn)實(shí)體,使用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 */
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解析rainbond以應(yīng)用為中心的架構(gòu)設(shè)計(jì)原理
這篇文章主要為大家介紹了rainbond以應(yīng)用為中心的架構(gòu)設(shè)計(jì)實(shí)現(xiàn)及原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02
從內(nèi)存地址解析Java的static關(guān)鍵字的作用
這篇文章主要介紹了從內(nèi)存地址解析Java的static關(guān)鍵字的作用,包括靜態(tài)成員變量和靜態(tài)方法等重要內(nèi)容,需要的朋友可以參考下2015-10-10
java獲取redis日志信息與動態(tài)監(jiān)控信息的方法
這篇文章主要給大家介紹了關(guān)于java如何獲取redis日志信息與動態(tài)監(jiān)控信息的方法,文中介紹的非常詳細(xì),對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04
一文讀懂a(chǎn)va中的Volatile關(guān)鍵字使用
volatile關(guān)鍵字的作用保證了變量的可見性(visibility)。被volatile關(guān)鍵字修飾的變量,如果值發(fā)生了變更,其他線程立馬可見,避免出現(xiàn)臟讀的現(xiàn)象。這篇文章主要介紹了ava中的Volatile關(guān)鍵字使用,需要的朋友可以參考下2020-03-03

