SpringBoot下Validator在SpringMVC中的使用

标签: validator hibernate-validator SpringBoot validation SpringMVC
8人阅读 评论(0) 收藏 举报
分类:

Spring Boot 数据校验框架 Hibernate-Validator 使用说明

文档简介

SpringBoot集成hibernate-validation快速使用说明

使用步骤

依赖

hibernate-validation,validation-api已经被添加在spring-boot-starter-web内,所以不需要添加依赖

配置

SpringMVC的javabean 配置方式如下所示

注意:快速失败方式才需要配置下面的,默认可以不用配置。


@Bean
public Validator validator(){
    ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
            .configure()
            .addProperty( "hibernate.validator.fail_fast", "true" ) //为true时代表快速失败模式,false则为全部校验后再结束。
            .buildValidatorFactory();
    Validator validator = validatorFactory.getValidator();

    return validator;
}

使用

两种常规校验

  1. Controller类上加入@Validated注解
  2. 在方法参数中添加相应的注解
  3. 注意:若方法参数上没有@Validated注解,则需要在类上加@Validated注解

参数为实体类对象

@Data
public class SysRole {

    private String id;

    @NotNull(message = "角色名称不能为空")
    private String name;

    @Size(min = 6, max = 20, message = "描述必须在6-20个字符之间")
    private String description;

    @Column(name = "create_time")
    private Date createTime;
}


@RequestMapping("/demo")
public void demo(@Valid SysRole sysRole, BindingResult result){
    if (result.hasErrors()) {
         List<ObjectError> allErrors = result.getAllErrors();
         StringBuilder sb = new StringBuilder();
         for (ObjectError objectError : allErrors) {
             sb.append(objectError.getDefaultMessage() + ";");
         }
         throw new ServiceException(sb.toString());  // 此处一定要抛出异常,否则校验框架不起作用。
     }
    //do something  
}

参数为单个字段

@GetMapping("/demo")
public void demo2(@Min(value = 1, message = "班级最小只能1")
                   @Max(value = 99, message = "班级最大只能99")
                   @RequestParam(name = "classroom", required = true) int classroom) {
                 //do something  
}  

分组校验

1.新建两个接口

public interface RoleUpdate {
}

public interface RoleAdd {
}

2.实体类中给字段加入分组

@Data
public class SysRole {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @NotEmpty(message = "角色ID不能为空", groups = {RoleUpdate.class})
    protected String id;

    @NotEmpty(message = "角色名称不能为空", groups = {RoleAdd.class})
    private String name;

    private String description;
}

3.Controller中的使用

@RestController
@RequestMapping("/sys/role")
public class SysRoleController {

    @PostMapping("/add")
    public RestResult add(@Validated({RoleAdd.class}) SysRole sysRole, BindingResult result){
        CoreUtil.validationHandler(result);
        sysRoleService.addRole(sysRole);
        return ResultGenerator.genSuccessResult();
    }

    @PostMapping("/update")
    public RestResult update(@Validated({RoleUpdate.class}) SysRole sysRole, BindingResult result) {
        CoreUtil.validationHandler(result);
        sysRoleService.update(sysRole);
        return ResultGenerator.genSuccessResult();
    }
}

4.组序列的使用:

//指定组的验证顺序,前面组验证不通过的,后面组不进行验证
@GroupSequence({RoleAdd.class, RoleUpdate.class, Default.class})
public interface GroupOrder {
}

常见的注解:

所有注解均有message这个参数,即你需要返回或捕获的内容
- @Null(message="") 被注释的元素必须为 null
- @NotNull 被注释的元素必须不为 null
- @AssertTrue 被注释的元素必须为 true
- @AssertFalse 被注释的元素必须为 false
- @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
- @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
- @Past 被注释的元素必须是一个过去的日期
- @Future 被注释的元素必须是一个将来的日期
- @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
- @Email 被注释的元素必须是电子邮箱地址
- @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
- @NotEmpty 被注释的字符串的必须非空
- @Range(min=,max=,message=) 被注释的元素必须在合适的范围内

异常信息处理


if(exception instanceof ConstraintViolationException){
    ConstraintViolationException exs = (ConstraintViolationException) exception;
    Set<ConstraintViolation<?>> violations = exs.getConstraintViolations();
    for (ConstraintViolation<?> item : violations) {
        //打印验证不通过的信息
        System.out.println(item.getMessage());
    }
}
查看评论

SpringBoot

让你快速掌握SpringBoot框架核心知识点!
  • 2018年04月12日 22:12

SpringMVC+HibernateValidator,配置在properties文件中的错误信息回显前端页面出现中文乱码

在springMVC中,后台使用hibernate-validator做参数校验的时候,用properties文件配置了校验失败的错误信息,发现回显给前端页面的时候中文错误信息显示乱码。...
  • stloven5
  • stloven5
  • 2016-11-23 21:13:26
  • 2408

使用Validator做SpringMVC的验证框架 - 使用Validator

前面一章我们已经搭好SpringMVC的环境了。现在开始学习Validator框架的使用吧 Validator框架源码地址:https://github.com/devefx/validator ...
  • devefx
  • devefx
  • 2016-06-02 15:35:55
  • 5105

使用Validator做SpringMVC的验证框架 - 配置SpringMVC环境

让我们用Validator框架来给SpringMVC实现验证功能吧 Validator框架源码地址:https://github.com/devefx/validator 完成这一章教程的要求 熟...
  • devefx
  • devefx
  • 2016-06-02 11:28:59
  • 4692

基于SpringMVC+hibernate-validator实现实现动态签名验证

首先我这个标题的意思先大家说说,我想要做的事情。 例如:我现在提供一个api给别人使用,然后api可能存在加签、解签、验签等过程,而且假设我不同的接入者使用了不同的签名规则MD5或者RAS,并且针对...
  • u011448427
  • u011448427
  • 2016-03-26 17:16:35
  • 4251

Spring MVC数据校验与国际化

1、 JSR-303JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator。 此实现与Hibernate O...
  • p_3er
  • p_3er
  • 2015-07-01 14:09:37
  • 3639

SpringMVC 之validator验证笔记(五)

SpringMVC支持的数据校验是JSR303的标准,通过在bean的属性上打上annotation @NotNull @Max等进行验证。JSR303提供有很多annotation借口,而Sprin...
  • tony308001970
  • tony308001970
  • 2017-05-24 16:54:23
  • 2410

springMVC结合hibernate validator校验数据

springMVC结合hibernate validator校验数据demo
  • sinat_26630143
  • sinat_26630143
  • 2017-08-22 00:26:22
  • 117

Spring Boot Validator框架

1,简介 Springboot validator 实际集成了Hibernatevalidator。主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数字的,等等。方...
  • wingkoo1986
  • wingkoo1986
  • 2017-04-26 00:09:10
  • 5048

SpringMVC 异常处理HandlerExceptionResolver 笔记(八)

SpringMVC提供4个异常处理解析器的实现 DefaultHandlerExceptionResolver SimpleMappingExceptionResolver AnnotationMet...
  • tony308001970
  • tony308001970
  • 2017-05-27 11:26:05
  • 612
    个人资料
    等级:
    访问量: 57
    积分: 24
    排名: 205万+
    文章存档