__震惊了!,一遍一遍在业务逻辑中编写的验证条件被抽离了!

是什么:


-

Java Specification Requests 303 ,用于对javaBean 属性的验证。

-


解决了什么问题:


-

1. 业务中充斥着对javabean属性的验证,这些都是很必要的验证,不能缺少,但是又让代码变得不那么可读,也不方便代码的维护,使用jsr303的相关技术,

就把对bean的验证抽取了出来,是业务代码更清晰。

-


要点:


-

1. 使用Bean Validation 的参考实现,如果使用jpa,那么就已经有了;
2. 使用注解限制bean的属性;
3. 在控制器方法中使用Vaild注解,表示当前参数需要被验证;
4. 紧随Valid注解写上Errors参数,用于接收验证参数时候产生的错误;
5. 如果觉得默认的注解不够用,完全可以自定义自己的验证注解。

-


demo1 【基本使用】:


-

pojo:

_

  1. import javax.validation.constraints.NotEmpty;
  2. import javax.validation.constraints.Past;
  3. import java.util.Date;
  4.  
  5. public class Person {
  6. @NotEmpty(message = "姓名不能为空")
  7. private String username;
  8. @Past(message = "生日只能是过去的日期")
  9. private Date birthday;

  10. // 省略其他方法
  11. }

  

_

controller:

_

  1. @RestController
  2. @RequestMapping("/t")
  3. public class TestController {
  4.  
  5. @PostMapping
  6. public Object binderTest(@RequestBody @Valid Person p, Errors errors) throws Exception {
  7. if(errors.hasErrors()){
  8. throw new Exception(errors.getFieldErrors().toString());
  9. }else{
  10. // do something
  11. // do something
  12. return p;
  13. }
  14. }
  15. }

  

_

截图:

-


demo02:【自定义constraint】


-

1.  编写验证所需要的注解;

2. 实现javax.validation.ConstraintValidator接口,可以使用Autowired注解注入其他服务进来;

3.覆写boolean isValid(T value, ConstraintValidatorContext context);方法,完成校验的逻辑;

代码:

  1. ///////////////////////////////////////////////////////////////////////
  2. ///注解///////////////////////////////////////////////////////////
  3. ///////////////////////////////////////////////////////////////////////
  4. import javax.validation.Constraint;
  5. import javax.validation.Payload;
  6. import java.lang.annotation.*;
  7.  
  8. @Constraint(validatedBy = {StatusValidator.class})
  9. @Documented
  10. @Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
  11. @Retention(RetentionPolicy.RUNTIME)
  12. public @interface Status {
  13. String message() default "不正确的状态 , 应该是 'created', 'paid', shipped', closed'其中之一";
  14.  
  15. Class<?>[] groups() default {};
  16.  
  17. Class<? extends Payload>[] payload() default {};
  18. }
  19.  
  20. ///////////////////////////////////////////////////////////////////////
  21. ///验证器//////////////////////////////////////////////////////////////
  22. ///////////////////////////////////////////////////////////////////////
  23. import javax.validation.ConstraintValidator;
  24. import javax.validation.ConstraintValidatorContext;
  25. import java.util.Arrays;
  26.  
  27. public class StatusValidator implements ConstraintValidator<Status, String> {
  28.  
  29. // 特别复杂的验证可能需要我们注入多个服务,也有可能一些验证需要查询数据库
  30. @Autowired
  31. private UserService userService;
  32.  
  33. private final String[] ALL_STATUS = {"created", "paid", "shipped", "closed"};
  34.  
  35. public void initialize(Status status) {
  36.  
  37. }
  38. // 验证方法,此方法中可以调用注入的服务,可以对数据库进行查询~
  39. public boolean isValid(String value, ConstraintValidatorContext context) {
  40.  
  41. User lhn = userService.findUserByUsername("lhn");
  42. System.out.println(lhn);
  43.  
  44. if(Arrays.asList(ALL_STATUS).contains(value))
  45. return true;
  46. return false;
  47. }
  48. }
  49.  
  50. ///////////////////////////////////////////////////////////////////////
  51. ///使用///////////////////////////////////////////////////////////////
  52. ///////////////////////////////////////////////////////////////////////
  53. public class Person {
  54. @NotEmpty(message = "姓名不能为空")
  55. private String username;
  56. @Past(message = "生日只能是过去的日期")
  57. private Date birthday;
  58. @Status
  59. private String status;
  60. }

  

-


SpringBoot#JSR303的更多相关文章

  1. [SpringBoot] - 配置文件的多种形式及JSR303数据校验

    Springboot配置文件: application.yml   application.properties(自带) yml的格式写起来稍微舒服一点 在application.properties ...

  2. Springboot:JSR303数据校验(五)

    @Validated //开启JSR303数据校验注解 校验规则如下: [一]空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @No ...

  3. SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(一): 搭建基本环境、整合 Swagger、MyBatisPlus、JSR303 以及国际化操作

    相关 (1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y- ...

  4. SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂)

    SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂) 一.SpringBoot全局异常 先讲下什么是全局异常处理器? 全局异常处理器就是把整个系统的异常统一自动处理,程序员 ...

  5. 【全网最全】springboot整合JSR303参数校验与全局异常处理

    一.前言 我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断,为了安全.因为前端很容易拜托,当测试使 ...

  6. SpringBoot 使用 JSR303 自定义校验注解

    JSR303 是 Java EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是hibernate Validator,有了它,我们可以在实体类的字段上标注不同的注解实现对数 ...

  7. 4 — springboot中的jsr303检验

    1.导入依赖 <!--JSR303校验的依赖 --> <dependency> <groupId>org.springframework.boot</grou ...

  8. springboot配置(yami配置文件,JSR303数据校验,多环境配置)

    yami配置文件 YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写.在开发的这种语言时,YAML 的意思其实是:&q ...

  9. SpringBoot 之 JSR303 数据校验

    使用示例: @Component @ConfigurationProperties(prefix = "person") @Validated //使用数据校验注解 public ...

随机推荐

  1. 写给想要入门python或者正在入门python的小朋友们

    写在前面: 最近好像python挺火,虽然我也在天天写python,但是python毕竟是动态语言,就拿常被人吐槽的java来说,python绝大不多数地方是不如java的.python只能是你的一个 ...

  2. PLSQL Developer常用设置及快捷键

    CSDN日报20170314--<40岁程序员真的要被淘汰了么?> 程序员2月书讯 [直播]用面向协议的思想简化网络请求 博客一键搬家活动开始啦 PLSQL Developer常用设置及快 ...

  3. 数字对象NSNumber的使用

    先简述下关于NSNumber的信息 NSNumber的存在就相当于java中的装箱与拆箱.只不过java中的装箱拆箱过程,使用的是对应的类型,比如基本数据类型是int.double类型,装箱时就得对应 ...

  4. Dubbo+zookeeper部署到tomcat上注意事项,遇到的问题,闪退,运行报错等

    需要下载工具zookeeper-3.4.14.tar.gz,dubbo-2.5.x.zip,apache-tomcat-8.5.47-windows-x64.zip这些官网都可以先下载到 1.最新的z ...

  5. CentOS7 安装PHP7的swoole扩展:

    一.绪 Swoole简介 PHP异步网络通信引擎 最终编译为so文件作为PHP的扩展 准备工作 Linux环境 PHP7 swoole2.1 redis 源码安装PHP7 源码安装swoole htt ...

  6. css 盒子模型简介

    盒子模型 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  7. Day9 - A - Apple Catching POJ - 2385

    Description 有两棵APP树,编号为1,2.每一秒,这两棵APP树中的其中一棵会掉一个APP.每一秒,你可以选择在当前APP树下接APP,或者迅速移动到另外一棵APP树下接APP(移动时间可 ...

  8. IOS TableView 用法

    1.在视图上创建TableView( 拖控件),为ViewController创建UITableView属性(链接至TableView)和NSArray属性(存储数据) ViewController. ...

  9. IdentityServer4专题之二:OpenID介绍

    1.基于概念 OpenId是一个以用户为中心的数字身份识别框架,它具有开放.分散.自由等特性.OpenId的创建是基于这样一个概念:我们可以通过URI(或者URL网址)来识别一个网站.同样,我们也可以 ...

  10. python 函数map()、filter()、reduce()

    map()函数    将一个列表进行遍历,对每一个字符串进行处理: 例如: num_list = ["我","是","哈哈","太 ...