Guava前置条件Preconditions类(参数校验)
作用
可以简洁的完成参数检验,在进行业务逻辑代码前进行前置判断。并且避免了冗长的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类(参数校验)相关推荐
- aop+注解 实现对实体类的字段校验_SpringBoot实现通用的接口参数校验
来自:掘金,作者:cipher 链接:https://juejin.im/post/5af3c25b5188253064651c76 原文链接:http://www.ciphermagic.cn/sp ...
- aop+注解 实现对实体类的字段校验_SpringBoot2.0实战(6)整合hibernate-validator进行参数校验...
spring-boot-starter-web 项目中默认已经集成了 hibernate-validator 相关知识 @AssertTrue // 用于 boolean 字段,该字段只能为 true ...
- java 实现批量注册---实现类层(含入参参数校验)
/*** 批量注册** @param file* @return*/@Transactional@Overridepublic Result batchRegistOrganUserByTemplat ...
- 利用反射做类参数的校验
需求描述 业务需求描述:对webservice接口参数校验 代码实现 /*** 字符串长度校验* * @param str* @param len* @return 合法(true),不合法(fals ...
- 蚂蚁金服宫孙:guava探究系列之优雅校验数据
优雅校验数据-前置条件 前言 根据防御式编程的要求, 在日常的开发中, 总少不了对函数的各种入参做校验, 以便保证函数能按照预期的流程执行下去. 比如各种费率的值就没可能是负数, 如果费率出现负数, ...
- Java参数校验validation和validator区别
Java参数校验validation和validator区别 1. 参数校验概述 2. validation与validator区别 3. validation注解说明 4. validator注解说 ...
- Google Guava常用工具类入门使用介绍及样例说明
一 概述 工具类将经常用的一些方法进行了封装,遇到相同的场景时不需要重复造轮子,从而大量节省开发人员时间和提高工作效率,Guava就是谷歌发布的高效率的方法的工具包.Guava的优势: API的设计高 ...
- SpringBoot:参数校验的使用(validator)
文章目录 SpringBoot参数校验的使用(validator) 一.validator简介 二.注解介绍 内置注解 扩展注解 三.validator的使用(手动校验) 创建校验工具类 对一个对象进 ...
- SpringMVC + Hibernate-Validator 参数校验
2019独角兽企业重金招聘Python工程师标准>>> 前言: Web开发中,最为常见的场景就是前端表单数据.Json数据与后端实体类的绑定,即使JS能校验并阻止大部分的必填漏填的风 ...
最新文章
- document.getElementById与getElementByName的区别
- 干货丨区块链如何改变人工智能(AI)?
- emc存储设备型号_图解EMC CLARiiON CX4系列主要型号
- python txt提取特定数据_Python提取列表中的内容 用“python”怎么提取文件里的指定内容?...
- 在女画家杨雁翎的画室派对
- dubbo优势_Dubbo 迈出云原生重要一步 应用级服务发现解析
- .NET常用工具类集锦
- 找出Java进程中大量消耗CPU
- Java开发快递物流项目(1)
- sip信令跟踪工具sngrep
- 隐含表(状态对图)消消乐
- pr字幕一个一个出现的笨方法
- HTML5:Animate cc交互之“影片剪辑”实现“按钮”功能
- 毕业5年决定人的一生(必看,大家有空一定要看看)
- 【移动架构】Flutter vs React Native:最后一句话。
- java 接口函数_Java函数式接口Supplier接口实例详解
- 计算机的典型应用及事例,大学计算机应用经典案例(高等学校大学计算机课程系列教材)...
- Session与Cookie(自定义Session)
- 典型大数据架构有哪些?我该怎么选择?
- 华为AI盘古大模型研究框架