1、SpringBoot支持JSR-303Bean驗證框架,默認使用Hibernate validator。在springMvc中,只需要使用註解標註在方法參數中,SpringBoot可對參數對象進行校驗,校驗結果放在BindingResult中。
2、JSR-303
(1)JSR-303是java標準的驗證框架,已有的實現由Hibernate validate。常用註解有以下幾種
空檢查
@Null 驗證對象是否爲空
@NotNull 驗證對象不爲空
@NotBlank 驗證不爲空字符串,""和" "都會失敗
@NotEmpty 驗證對象不爲null,或者集合不爲空
長度檢查
@Size(min = ,max = )驗證對象長度,可支持字符串、集合 @Length 字符串大小
數值檢測
@Min驗證是否大於等於指定的值
@Max驗證是否小於等於指定的值
@Digits驗證是否符合指定格式,如@Digits(integer=9,fraction=2)
@Range驗證是否在指範圍內,如@range(min=1,max=1000)
其他
@Email,驗證是否爲郵件格式,爲null不做校驗
@Pattern,驗證String是否符合正則表達式
(2)在一些其他的應用場景,不同的業務邏輯會有不同的業務需求,比如當更新的時候,id必須爲null,但增加的時候,id必須爲null。
在JSR-303中定義了group,每個校驗註解必須支持。可以匹配一個或者多個group
(3)使用場景
package com.blog.pojo; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; import javax.validation.constraints.Pattern; /** * @author admin * @date 2018/10/9 */ public class TbItemCatModel { public interface Add { } public interface Update { } @Null(groups = {Add.class}) @NotNull(groups = Update.class) private Long id; @ private Long parentId; @Pattern(regexp = "0-9a-zA-Z", message = "只能爲字母或數字") private String name; private Long TypeId; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getParentId() { return parentId; } public void setParentId(Long parentId) { this.parentId = parentId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getTypeId() { return TypeId; } public void setTypeId(Long typeId) { TypeId = typeId; } }
(2)contronller攔截
@RequestMapping(value = "/addItemCat") public void addItemCat(@Validated({TbItemCatModel.Update.class}) TbItemCatModel itemCatModel, BindingResult result) { if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); FieldError fieldError = (FieldError) allErrors.get(0); System.out.println(fieldError.getObjectName() + fieldError.getField() + fieldError.getDefaultMessage()); return; } return; }
3、自定義校驗
(1)
package com.blog.annotion; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; //Constraint表示用什麼類作爲註解實現類 @Constraint(validatedBy = {WorkTimeValidator.class}) @Documented @Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface WorkOverTime { //用於創建錯誤信息, String message() default "加班時間過長,不能超過{max}小時"; int max() default 5; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default{}; }
(2)
package com.blog.annotion; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * @author admin * @date 2018/10/30 */ public class WorkTimeValidator implements ConstraintValidator<WorkOverTime, Integer> { WorkOverTime work; int max; @Override public void initialize(WorkOverTime work) { this.work = work; max=work.max(); } @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { if (value == null) { return true; } return value < max; } }
(3) package com.blog.pojo; import com.blog.annotion.WorkOverTime; import org.apache.ibatis.annotations.Update; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; import javax.validation.constraints.Pattern; /** * @author admin * @date 2018/10/9 */ public class TbItemCatModel { /*public interface Add { } public interface Update { } @Null(groups = {Add.class})*/ @NotNull//(groups = Update.class) private Long id; private Long parentId; @Pattern(regexp = "0-9a-zA-Z", message = "只能爲字母或數字") private String name; private Long TypeId; @WorkOverTime(max=2) private int workTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getParentId() { return parentId; } public void setParentId(Long parentId) { this.parentId = parentId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getTypeId() { return TypeId; } public void setTypeId(Long typeId) { TypeId = typeId; } public int getWorkTime() { return workTime; } public void setWorkTime(int workTime) { this.workTime = workTime; } }
(4)
@RequestMapping(value = "/addItemCat") public void addItemCat(@Validated @RequestBody TbItemCatModel itemCatModel, BindingResult result) { if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); FieldError fieldError = (FieldError) allErrors.get(0); System.out.println(fieldError.getObjectName() + fieldError.getField() + fieldError.getDefaultMessage()); return; } return; }