参数校验(Hibernate-Validation)
ibernate Validator 是 Bean Validation 的參考實(shí)現(xiàn) . Hibernate Validator 提供了 JSR 303 規(guī)范中所有內(nèi)置 constraint 的實(shí)現(xiàn),除此之外還有一些附加的 constraint。
依賴(lài)
<!--參數(shù)校驗(yàn)--><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.14.Final</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.el</artifactId><version>3.0.1-b11</version></dependency>Bean 注解
使用在字段上
@Null 限制只能為null
@NotNull 限制必須不為null
@NotEmpty 驗(yàn)證注解的元素值不為null且不為空,支持字符串、集合、Map和數(shù)組類(lèi)型
@Max 限制必須為一個(gè)不大于指定值的數(shù)字
@Min 限制必須為一個(gè)不小于指定值的數(shù)字
@Range 限制必須在合適的范圍內(nèi)
@Size 限制字符長(zhǎng)度必須在min到max之間
@AssertFalse 限制必須為false
@AssertTrue 限制必須為true
@DecimalMax 限制必須為一個(gè)不大于指定值的數(shù)字
@DecimalMin 限制必須為一個(gè)不小于指定值的數(shù)字
@Digits 限制必須為一個(gè)小數(shù),且整數(shù)部分的位數(shù)不能超過(guò)integer,小數(shù)部分的位數(shù)不能超過(guò)fraction
@Email 驗(yàn)證注解的元素值是Email,也可以通過(guò)正則表達(dá)式和flag指定自定義的email格式 @Future 限制必須是一個(gè)將來(lái)的日期
@NotBlank 驗(yàn)證注解的元素值不為null且去除空格后長(zhǎng)度不為0,
@NotBlank只用于字符串
@Past 限制必須是一個(gè)過(guò)去的日期
@Pattern 限制必須符合指定的正則表達(dá)式
實(shí)例
import java.time.LocalDateTime; import java.io.Serializable;import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.Data;import org.hibernate.validator.constraints.Length; import org.springframework.data.annotation.Id;import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull;/*** 來(lái)訪(fǎng)人員登記表*/ @Data public class VisitorRecord implements Serializable {private static final long serialVersionUID = 1L;/*** 主鍵自增*/@Idprivate Long id;/*** 姓名*/@NotNull(message = "來(lái)訪(fǎng)人名字 必填")@NotEmpty(message = "來(lái)訪(fǎng)人名字 必填")private String name;/*** 性別 1男2女3未知*/@NotNull(message = "name 不能為null")@Max(3)@Min(1)private Integer sex;/*** 重點(diǎn)人員分類(lèi) 1鬧訪(fǎng)人員 2長(zhǎng)期信訪(fǎng) 3職業(yè)信訪(fǎng) 4失信被執(zhí)行 5其他*/private Integer majorType;/*** 人員所屬省份編碼*/@NotNull(message = "省份編碼 必填")@NotEmpty(message = "省份編碼 必填")private String provinceCode;/*** 人員所屬省份名稱(chēng)*/@NotNull(message = "省份名稱(chēng) 必填")@NotEmpty(message = "省份名稱(chēng) 必填")private String provinceName;/*** 人員來(lái)訪(fǎng)的法院編碼*/private String courtCode;/*** 人員來(lái)訪(fǎng)的法院名稱(chēng)*/private String courtName;/*** 來(lái)訪(fǎng)時(shí)間*/@NotNull(message = "來(lái)訪(fǎng)時(shí)間 必填")private LocalDateTime visitTime;/*** 新增時(shí)間*/private LocalDateTime insertTime;/*** 修改時(shí)間*/private LocalDateTime updateTime;/*** 身份證號(hào)*/@NotNull(message = "身份證號(hào) 必填")@NotEmpty(message = "身份證號(hào) 必填")@Length(min=18,max = 18)private String idCard;/*** 來(lái)訪(fǎng)人事由 1立案2信訪(fǎng)3出庭4訪(fǎng)客5律師*/@NotNull(message = "來(lái)訪(fǎng)事由 必填")@Min(1)@Max(5)private Integer visitorEvent;/*** 重點(diǎn)人員 1是2否*/private Integer whetherMajor;} @RestController 方法中在需要校驗(yàn)的 bean 前面添加 public class TestController { ?@PostMapping("/addUser")public void addUser(@Validated @RequestBody VisitorRecord visitor) throws Exception {System.out.println(user);} }自定義校驗(yàn)
用戶(hù)可以實(shí)現(xiàn)自己的校驗(yàn)注解。
下面的例子實(shí)現(xiàn)一個(gè)自定義注解,要求參數(shù)不能與設(shè)置的值相等
@Documented ???????@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = NotEqualValidator.class) public @interface NotEqual {String message() default "不能與給定的值相等"; ?Class<?>[] groups() default {}; ?Class<? extends Payload>[] payload() default {}; ?String value(); }注解實(shí)現(xiàn)類(lèi)
public class NotEqualValidator implements ConstraintValidator<NotEqual, String> { ?private String value; ?@Overridepublic void initialize(NotEqual constraintAnnotation) {this.value = constraintAnnotation.value();} ?@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {return !s.equals(value);} } @RestController @Validated public class TestController { ?@GetMapping(value = "/test")public void test(@NotEqual("1111") @RequestParam String url) throws Exception {System.out.println(url);} }自定義異常處理
當(dāng)參數(shù)校驗(yàn)沒(méi)有通過(guò)時(shí),Hibernate Validator 會(huì)拋出異常。但是 SpringBoot 默認(rèn)的異常返回結(jié)果可能并不是用戶(hù)所希望的,就像上面的例子一樣。我只想獲取報(bào)錯(cuò)信息,不希望返回異常的頁(yè)面。這個(gè)時(shí)候我們可以通過(guò) @ControllerAdvice 來(lái)自定義異常處理,返回自己希望的結(jié)果。
下面是一個(gè)自定義異常的例子。
返回結(jié)果封裝類(lèi):
public class ServiceResult { ?private Integer code;private String message;private Object result; ?public ServiceResult () {} ?public ServiceResult(Integer code, String message) {this.code = code;this.message = message;} ?// get set 省略 }全局異常處理類(lèi),主要用來(lái)處理參數(shù)校驗(yàn)沒(méi)有通過(guò)時(shí)的異常信息?
@ControllerAdvice @RestController public class GlobalExceptionHandler { ?// 方法參數(shù)校驗(yàn)異常@ExceptionHandler(value = ConstraintViolationException.class)public ServiceResult constraintViolationException(Exception e) {if (e.getMessage() != null) {int index = e.getMessage().indexOf(":");return new ServiceResult(HttpStatus.BAD_REQUEST.value(), index != -1 ?e.getMessage().substring(index + 1).trim() : e.getMessage());}return new ServiceResult(HttpStatus.BAD_REQUEST.value(), null);} ? ?// Bean 校驗(yàn)異常@ExceptionHandler(value = MethodArgumentNotValidException.class)public ServiceResult notValidExceptionHandler(MethodArgumentNotValidException e) throws Exception {ServiceResult ret = new ServiceResult();ret.setCode(HttpStatus.BAD_REQUEST.value());if (e.getBindingResult() != null && !CollectionUtils.isEmpty(e.getBindingResult().getAllErrors())) {ret.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());} else {ret.setMessage(e.getMessage());}return ret;} ? } ?自定義返回結(jié)果:
{"code": 400,"message": "不能與給定的值相等","result": null } ?總結(jié)
以上是生活随笔為你收集整理的参数校验(Hibernate-Validation)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: war3显地图
- 下一篇: 实验室项目-智能家居介绍