今天我们主要分享项目实战中,另一种常用的参数校验框架 Hibernate Validator,请准备好小板凳,我们的分享开始。

1.

是啥?

先抛一张图,锻炼一下你的观察力。

通过上图有没有发现,数据校验可谓是贯穿所有的应用程序层(从表示层到持久层),而通常在每一层要实现相同的验证逻辑,这样既耗时又容易出错。

那再抛一张图,欢迎大家一起来找茬(结合上幅图)。

我们会发现,为了避免每层进行重复的数据验证,可以将验证逻辑直接捆绑到域模型中,将域类与验证代码混淆。

有点意思,你可能会有点懵,莫急!你就简单认为在你的实体类属性上加点校验规则,但是这些校验规则到底该怎么加呢?

这不在 JSR380-Bean Validation 2.0 中为实体和方法验证定义元数据模型和API,是不是又茫然啦,啥是 JSR?啥是JSR380?

为了以后再见到内心不发虚,我们再解释一下。

JSR 是 Java 界的一个重要标准,是 Java Specification Requests 的缩写,意思是 Java 规范提案,任何人都可以提交 JSR ,以向 Java 平台增添新的 API 和服务。

JSR380-Bean Validation 2.0 是 Java 定义的一套最新的数据校验规范。

说了这么多,只有规范没有实现,一切都是扯淡。别急,该我们的大猪蹄子 Hibernate Validator 登场了。

那 Hibernate Validator 到底是啥?一句话说清楚:Hibernate Validator 是 JSR 380 数据校验规范的一种实现。

到这,你多多少少应该了解 JSR、JSR 380、Hibernate Validator。

好了,光耍嘴皮子,不干活那是码农中的流氓,也是时候真刀真枪的操练起来了。

2.

咋用?

第一步:引入依赖包。不用太纠结,用就完了。

<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.17.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b09</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-cdi</artifactId>
<version>6.0.17.Final</version>
</dependency>
</dependencies>

  

第二步:定义登录请求对象,添加校验规则。主要关注注解即可,So easy!!

import javax.validation.constraints.*;

public class UserLoginRequest {

    @NotNull(message = "[接口版本号]不能为空!")
@Pattern(regexp = "^(\\d+)(\\.\\d+)?$", message = "[接口版本号]格式错误!")
@Size(min = 0, max = 4, message = "[接口版本号]长度错误,最大长度为[{max}]!")
private String versionNo; @NotNull(message = "[手机号]不能为空!")
@Size(min = 0, max = 11, message = "[用户手机号码]长度错误,最大长度为[{max}]!")
private String mobile; @NotNull(message = "[订单号]不能为空!")
@Size(min = 0, max = 32, message = "[订单号]长度错误,最大长度为[{max}]!")
private String orderId; @NotNull(message = "[验证码]不能为空!")
@Size(min = 0, max = 6, message = "[验证码]长度错误,最大长度为[{max}]!")
private String smsCode; //TODO 提供setter/getter ... ...
}

  

第三步:按照常规,应该写个测试类,跑跑看,这次咱们就一步到位,直接封装工具类。你可以直接拿到真实项目去实践,用良心保证绝对好用。

import javax.validation.*;
import java.util.*; public class ValidateUtil { public static <T> void validate(T t) {
if (null == t) {
throw new ValidateException("E0001", "参数为空");
} ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(t); List<String> errorList = new ArrayList<String>();
for (ConstraintViolation<T> constraintViolation : constraintViolations) {
errorList.add(constraintViolation.getMessage());
}
if (!errorList.isEmpty()) {
throw new ValidateException("E9999", errorList.toString());
}
}
}

  

第四步:自定义异常,这个根据实际情况而定,非必须。

public class ValidateException extends RuntimeException {

    private String code;
private String msg; /**
* @param code 异常码
* @param msg 异常消息
*/
public ValidateException(String code, String msg) {
super(msg);
this.setCode(code);
this.setMsg(msg);
} //TODO 提供setter/getter ... ...
}

  

第五步:跑起来,看一看是否经得起考验。

public class App {
public static void main(String[] args) {
UserLoginRequest request = new UserLoginRequest();
request.setVersionNo("abc"); //版本号输入错误
request.setMobile("138013800000"); //手机号长度有误
try {
ValidateUtil.validate(request);
} catch (ValidateException e) {
//TODO 在实际业务中直接获取异常码、异常信息进行包装返回给前端即可
System.out.println(String.format("code: %s, msg:%s",e.getCode(),e.getMsg()));
}
}
}

  

第六步:结果分析,看到结果,果真达到预期:手机号码长度错误、接口版本号格式有误、其它参数值传入为空。

3.

技术无止境,剩下的还需要各位自行去耕耘,不过掌握上面这些,已经够你在项目中喝一壶的啦。

好了,通过这次正规军式的分享 + 上次野战军式的分享,相信你今后肯定能玩转 API 参数校验,也就可以专心去写业务代码啦,如果你之前尚未接触过这些,不妨拿去实践,大概率会大幅提升你的研发效率,腾出更多时间喝咖啡,幸福感陡然上升。

API参数如何验证?别纠结,拿去用就是的更多相关文章

  1. .Net Core Web Api使用模型验证验证参数合法性

    在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输 ...

  2. 徒手生撸一个验证框架,API 参数校验不再怕!

    你们之中大概率早已练就了代码的拷贝.粘贴,无敌的码农神功,其实做久了业务功能开发,练就这两个无敌神功,那是迟早的事儿.今天先抛一个小问题,来打通你的任督二脉,就是很好奇的问一下:业务功能开发中,输入参 ...

  3. ABP(现代ASP.NET样板开发框架)系列之17、ABP应用层——参数有效性验证

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之17.ABP应用层——参数有效性验证 ABP是“ASP.NET Boilerplate Project (ASP. ...

  4. 细说 Web API参数绑定和模型绑定

    今天跟大家分享下在Asp.NET Web API中Controller是如何解析从客户端传递过来的数据,然后赋值给Controller的参数的,也就是参数绑定和模型绑定. Web API参数绑定就是简 ...

  5. ABP应用层——参数有效性验证

    ABP应用层——参数有效性验证 基于DDD的现代ASP.NET开发框架--ABP系列之17.ABP应用层——参数有效性验证 ABP是“ASP.NET Boilerplate Project (ASP. ...

  6. Parameter Binding in ASP.NET Web API(参数绑定)

    Parameter Binding in ASP.NET Web API(参数绑定) 导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnbl ...

  7. SpringBoot2.0针对请求参数@RequestBody验证统一拦截

    title: "SpringBoot2.0针对请求参数@RequestBody验证的统一拦截"categories: SpringBoot2.0 Shirotags: Spring ...

  8. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  9. .net core Web API参数绑定规则

    参数推理绑定 先从一个问题说起,微信小程序按照WebAPI定义的参数传递,Get请求服务器端可以正常接收到参数,但是Post请求取不到. Web API代码(.netcore 3.1)如下: [Htt ...

随机推荐

  1. 03 HDFS的客户端操作

    服务器和客户端的概念 hdfs的客户端有多种形式 1.网页形式 2.命令行形式 3.客户端在哪里运行,没有约束,只要运行客户端的机器能够跟hdfs集群联网 参数配置 文件的切块大小和存储的副本数量,都 ...

  2. 【python pip】一招解决pip下载过慢问题

    目录 概述 壹:问题描述 贰:解决过程 一.问题分析 二.问题解决 方法一:下载时加入参数-i [镜像源地址] 方法二:设置源 三.国内镜像源地址 叁:作者有话 作者 概述 在我们经常使用pip安装插 ...

  3. 编译putty 源码去掉 Are you sure you want to close this session? 提示

    0, 为什么要编译 putty ?在关闭窗口的时候,会弹出一个 Are you sure you want to close this session?要把这个去掉.当然也可以用 OD 之类的来修改. ...

  4. JavaMail(一):利用JavaMail发送简单邮件

    JavaMail,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.但它并没有包含在JDK中,要使用JavaMail首先要下载ja ...

  5. (转)C++中的delete

    转载自:http://blog.csdn.net/sparkliang/article/details/3670930 为了防止内存泄漏,每一个动态内存分配必须有一个等同相反的内存释放操作,delet ...

  6. 学习webpack基础笔记01

    学习webpack基础笔记 1.webpack搭建环境最重要的就是如何使用loader和plugins,使用yarn/npm安装插件.预处理器,正确的配置好去使用 2.从0配置webpack - 1. ...

  7. java常用日期类总结

    java 常用的日期类有三个Date.SimpleDateFormat.Calendar

  8. JDBC封装-Java(新手)

    JDBC的封装,自己总结的自己总结的自己总结的 dao (代码分层)命名规范: 1.com.XXX.dao 存放dao相关的类型 例如 StudentDAOImpl 处理 数据库的链接 存取数据 2. ...

  9. 在d盘创建文件夹,里面有aaa.txt/bbb.txt/ccc.txt,然后遍历出aaa文件夹下的文件(新手)

    //导入的包.import java.io.File;import java.io.IOException;//创建的一个类.public class zy { //公共静态的主方法. public ...

  10. SpringBoot的启动流程是怎样的?SpringBoot源码(七)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 温故而知新 本篇接 SpringBoot内置的各种Starter是怎样构建的? SpringBoot源码(六) 温故而知新, ...