springbooot 数据校验@Validation及分组校验

三种校验包区分

  1. JSR303是一项标准,JSR-349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.constraints包下,只提供规范不提供实现。

  2. hibernate validation是对这个规范的实践(不要将hibernate和数据库orm框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如@Email,@Length,@Range等等,他们位于org.hibernate.validator.constraints包下。

  3. 万能的spring为了给开发者提供便捷,对hibernate validation进行了二次封装,校验validated bean时,你可以使用spring validation或者hibernate validation,而spring validation另一个特性,便是其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中。这无疑便捷了我们的web开发。

    此段内容借鉴:https://blog.csdn.net/u013815546/article/details/77248003

springboot实例

  1. 导包:spring-boot-starter-web

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    我们观察项目依赖树:
    在这里插入图片描述
    我们可以发现这个包已经自动报我们导入了hibernate validation包了,这也验证了上一步的内容。

  2. 编写实体类User

    import lombok.Data;
    
    import javax.validation.constraints.Email;
    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.Pattern;
    
    
    @Data
    public class User {
    
        @NotBlank
        @Pattern(regexp = "^\\w+$",message = "用户名不合法")
        private String username;
    
        @Min(value = 18,message = "年龄要大于18")
        private int age;
    
        @Email(message = "邮箱不合法")
        private String email;
    }
    
  3. 编写返回的类ResponseEntity

    @Data
    public class ResponseEntity<T> {
        private T data;
        private String status;
        private int code;
    
        public ResponseEntity() {
        }
        public ResponseEntity(T data, String status, int code) {
            this.data = data;
            this.status = status;
            this.code = code;
        }
        public ResponseEntity(StatusCode statusCode) {
            this.status = statusCode.getStatus();
            this.code = statusCode.getCode();
        }
    }
    
  4. 编写controller类
    备注:不考虑分组校验功能用@Valid和@Validated效果都一样,@Validated支持分组校验。

    @ResponseBody
    @RequestMapping(value = "/testValidate", method = RequestMethod.POST)
    public ResponseEntity testValidate(@Validated @RequestBody User user, BindingResult bindingResult) {
        ResponseEntity res = new ResponseEntity();
        if (bindingResult.hasErrors()) {
            res = new ResponseEntity();
            //用于存储校验错误信息
            ArrayList<String> errs = new ArrayList();
            for (ObjectError error : bindingResult.getAllErrors()) {
                errs.add(error.getDefaultMessage());
            }
            res.setData(errs);
            res.setCode(300);
            res.setStatus("校验失败");
    
        } else {
            res.setData(null);
            res.setCode(200);
            res.setStatus("校验成功");
        }
        return res;
    }
    
  5. 验证结论:
    在这里插入图片描述

分组校验

1.三个分组接口

public interface Group1 {
}

public interface Group2 {
}

@GroupSequence({Group1.class,Group2.class})
public interface AllGroup {
}

2.实体类准备

import javax.validation.constraints.*;
	
	
	@Data
	public class User {
	
	    @NotBlank(message = "姓名不能为空", groups = {Group1.class})
	    @Pattern(regexp = "^\\w*$", message = "用户名只能是数字", groups = {Group2.class})
	    private String username;
	
	    @NotNull(message = "年龄不能为空", groups = {Group1.class})
	    @Min(value = 18, message = "年龄要大于18", groups = {Group2.class})
	    private int age;
	
	    @NotBlank(message = "邮箱不能为空", groups = {Group1.class})
	    @Email(message = "邮箱不合法", groups = {Group2.class})
	    private String email;
	}

3.controller类:

    @ResponseBody
    @RequestMapping(value = "/testValidate", method = RequestMethod.POST)
    public ResponseEntity testValidate(@Validated(AllGroup.class) @RequestBody  User user, BindingResult bindingResult) {
        ResponseEntity res = new ResponseEntity();
        if (bindingResult.hasErrors()) {
            res = new ResponseEntity();
            //用于存储校验错误信息
            ArrayList<String> errs = new ArrayList();
            for (ObjectError error : bindingResult.getAllErrors()) {
                errs.add(error.getDefaultMessage());
            }
            res.setData(errs);
            res.setCode(300);
            res.setStatus("校验失败");

        } else {
            res.setData(null);
            res.setCode(200);
            res.setStatus("校验成功");
        }
        return res;
    }
}

4.测试
(1) 分组1未通过
在这里插入图片描述
(2) 分组1通过,分组2未通过在这里插入图片描述
(3) 校验通过
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值