作用

可以简洁的完成参数检验,在进行业务逻辑代码前进行前置判断。并且避免了冗长的if语句。guava将所有检验的API都放置于Preconditions类中。

API

Preconditions类大致分为6种提供参数检验的方法,每种方法都有三个重载方法。重载方法的参数意义是:

1、仅有待校验的参数:抛出的异常中没有错误消息;

2、有一个Object对象作为额外参数:抛出的异常使用Object.toString() 作为错误消息;

3、有一个String对象作为额外参数,还有一个Object[]参数,这两个参数也是适用于异常错误消息的,处理的方式类似于String.format将Object的参数按顺序替换掉String中的占位符(如%s)

方法 描述 检查失败时抛出的异常
checkArgument(boolean) 检查boolean是否为true,用来检查传递给方法的参数。 IllegalArgumentException
checkNotNull(T) 检查value是否为null,该方法直接返回value,否则抛出异常。 NullPointerException
checkState(boolean) 用来检查对象的某些状态。 IllegalStateException
checkElementIndex(int index, int size) 检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && index<size *。 IndexOutOfBoundsException
checkPositionIndex(int index, int size) 检查index作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size *。 IndexOutOfBoundsException
checkPositionIndexes(int start, int end, int size) 检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效* IndexOutOfBoundsException

如:我们在做登录操作的方法中,在未用前置条件前,代码可能会如下:

public User login(String userName,String password){if(StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)){throw new RuntimeException("用户名或密码不能为空");}User user = userService.queryUserByUserNameAndPassword(userName,password);if(null == user){throw new RuntimeException("用户名或密码错误");}//…………………………………………省略业务逻辑…………………………………………
}

checkArgument

当使用了Preconditions类后

public User login(String userName,String password){Preconditions.checkArgument(!(StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)),"用户名或密码不能为空");User user = userService.queryUserByUserNameAndPassword(userName,password);Preconditions.checkNotNull(user,"用户名或密码错误");//…………………………………………省略业务逻辑…………………………………………
}

思考

相信大家也发现了,Preconditions类与Assert断言类的思想基本是一致的,通过这个思想,我们也可以实现属于自己的断言类从而提升自己的开发效率。

假设一个场景,我们是基于接口开发工作的,接口通过JSON传递数据给前端。此时我们先定义一个JSON的结构。

public class ResponseEntity<T> implements Entity<T>,Serializable{private static final long serialVersionUID = 1L;//数据实体private T data;//结果码private Integer code;//错误描述private String message;//…………
}

自定义一个异常类

public class GlobException extends RuntimeException{private static final long serialVersionUID = 1L;private String message;private Integer code;
}

定义自己的前置条件类(断言类)

/*** 断言类* @author cjl*/
public abstract class Assert {/*** 断言对象不为空,若对象为空则报异常* @param obj 待校验对象* @param message 异常信息*/public static void notNull(Object obj,String message){if(obj == null)throw new GlobException(message);}/*** 断言对象不为空,若对象为空则报异常* @param obj 待校验对象*/public static void notNull(Object obj){Assert.notNull(obj, "The Object can't null");}/*** 断言数字不能为零,若数字为零则报异常* @param num 待校验数字* @param message 异常信息*/public static void notZero(Integer num,String message){Assert.notNull(num);if(num.intValue() == 0)throw new GlobException(message);}/*** 断言数字不能为零,若数字为零则报异常* @param num 待校验数字*/public static void notZero(Integer num){Assert.notZero(num,"The number can't equals zero");}/*** 断言字符串不能为空,若字符串为空则报异常* @param string 待校验字符串* @param message 异常信息*/public static void notEmpty(String string,String message){if(StringUtils.isEmpty(string))throw new GlobException(message);}/*** 断言字符串不能为空,若字符串为空则报异常* @param string 待校验字符串*/public static void notEmpty(String string){Assert.notEmpty(string,"The string can't empty");}/*** 断言该布尔值为true,若为false则抛异常* @param expression 待校验布尔值* @param message  异常信息*/public static void isTrue(boolean expression,String message){if(!expression)throw new GlobException(message);}/*** 断言该布尔值为true,若为false则抛异常* @param expression 待校验布尔值*/public static void isTrue(boolean expression){Assert.isTrue(expression,"The expression not true");}
}

这时候在定义一个全局异常处理类,这里使用的是Spring Mvc的@ControllerAdvice注解

*** 全局异常处理* @author cjl*/
@ControllerAdvice
public class ExceptionHandlers {@SuppressWarnings("rawtypes")@ResponseBody@ExceptionHandler(GlobException.class)public ResponseEntity<?> exceptionHandler(GlobException exception){outException(exception);return new ResponseEntity(exception);}/*** 异常输出* @param exception*/private void outException(GlobException exception) {String content = String.format("****************系统发生异常(%s)************************", exception.getMessage());System.out.println(content);}}

和上面的例子一样,我们现在实现一个完成登录的接口。

@RequestMapping("/login")public ResponseEntity<?> login(String userName,String password){Assert.isTrue(!(StringUtils.isEmpty(userName)||StringUtils.isEmpty(password)),"用户名或密码不能为空");User user = userService.queryByUserNameAndPassword(userName, password);Assert.notNull(user,"用户名或密码错误");return ResponseEntity.success(user);
}

现在我们传用户名和密码,其中账号为空:

接下来传错误的用户名和密码

正确的账号密码,完成登录

Guava前置条件Preconditions类(参数校验)相关推荐

  1. aop+注解 实现对实体类的字段校验_SpringBoot实现通用的接口参数校验

    来自:掘金,作者:cipher 链接:https://juejin.im/post/5af3c25b5188253064651c76 原文链接:http://www.ciphermagic.cn/sp ...

  2. aop+注解 实现对实体类的字段校验_SpringBoot2.0实战(6)整合hibernate-validator进行参数校验...

    spring-boot-starter-web 项目中默认已经集成了 hibernate-validator 相关知识 @AssertTrue // 用于 boolean 字段,该字段只能为 true ...

  3. java 实现批量注册---实现类层(含入参参数校验)

    /*** 批量注册** @param file* @return*/@Transactional@Overridepublic Result batchRegistOrganUserByTemplat ...

  4. 利用反射做类参数的校验

    需求描述 业务需求描述:对webservice接口参数校验 代码实现 /*** 字符串长度校验* * @param str* @param len* @return 合法(true),不合法(fals ...

  5. 蚂蚁金服宫孙:guava探究系列之优雅校验数据

    优雅校验数据-前置条件 前言 根据防御式编程的要求, 在日常的开发中, 总少不了对函数的各种入参做校验, 以便保证函数能按照预期的流程执行下去. 比如各种费率的值就没可能是负数, 如果费率出现负数, ...

  6. Java参数校验validation和validator区别

    Java参数校验validation和validator区别 1. 参数校验概述 2. validation与validator区别 3. validation注解说明 4. validator注解说 ...

  7. Google Guava常用工具类入门使用介绍及样例说明

    一 概述 工具类将经常用的一些方法进行了封装,遇到相同的场景时不需要重复造轮子,从而大量节省开发人员时间和提高工作效率,Guava就是谷歌发布的高效率的方法的工具包.Guava的优势: API的设计高 ...

  8. SpringBoot:参数校验的使用(validator)

    文章目录 SpringBoot参数校验的使用(validator) 一.validator简介 二.注解介绍 内置注解 扩展注解 三.validator的使用(手动校验) 创建校验工具类 对一个对象进 ...

  9. SpringMVC + Hibernate-Validator 参数校验

    2019独角兽企业重金招聘Python工程师标准>>> 前言: Web开发中,最为常见的场景就是前端表单数据.Json数据与后端实体类的绑定,即使JS能校验并阻止大部分的必填漏填的风 ...

最新文章

  1. document.getElementById与getElementByName的区别
  2. 干货丨区块链如何改变人工智能(AI)?
  3. emc存储设备型号_图解EMC CLARiiON CX4系列主要型号
  4. python txt提取特定数据_Python提取列表中的内容 用“python”怎么提取文件里的指定内容?...
  5. 在女画家杨雁翎的画室派对
  6. dubbo优势_Dubbo 迈出云原生重要一步 应用级服务发现解析
  7. .NET常用工具类集锦
  8. 找出Java进程中大量消耗CPU
  9. Java开发快递物流项目(1)
  10. sip信令跟踪工具sngrep
  11. 隐含表(状态对图)消消乐
  12. pr字幕一个一个出现的笨方法
  13. HTML5:Animate cc交互之“影片剪辑”实现“按钮”功能
  14. 毕业5年决定人的一生(必看,大家有空一定要看看)
  15. 【移动架构】Flutter vs React Native:最后一句话。
  16. java 接口函数_Java函数式接口Supplier接口实例详解
  17. 计算机的典型应用及事例,大学计算机应用经典案例(高等学校大学计算机课程系列教材)...
  18. Session与Cookie(自定义Session)
  19. 典型大数据架构有哪些?我该怎么选择?
  20. 华为AI盘古大模型研究框架

热门文章

  1. android的虚拟机
  2. 组合数学(4)——拉丁方矩阵
  3. 经济基础知识(初级)【16】
  4. 体感ar数字互动教学制作实现学生共享优质教育
  5. node.js 不能识别?.问号点运算符
  6. 帝国cms 留言反馈 问题
  7. Agv、Rgv 车辆控制调度系统开发第一篇
  8. 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 5
  9. Python str(float) 科学计数法
  10. 魔兽RPG地图破解及修改方法