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; }