一、为什么要用断言机制
- 平时做判断通常都是这样写
if (message== null || message.equls("")) {
throw new IllegalArgumentException("输入信息错误!");
}
用Assert工具类上面的代码可以简化为:
Assert.hasText(message, "输入信息错误!");
- java assert表达式在运行时如果条件校验失败,则抛Error,Spring Assert的方法有以下特点:
- 都是static方法;
- 抛出IllegalArgumentException 或 IllegalStateException异常;
- 第一个参数通常是需验证的对象或逻辑条件,最后参数通常是异常消息,用于验证失败时显示;
- 消息可以作为String参数或Supplier参数传输;
二、Spring Assert
org.springframework.util.Assert断言工具类
2.1 对象和类型断言
notNull(Object object, String message)
:入参一定不是 null;isNull(Object object, String message)
:入参一定是 null;isInstanceOf(Class type, Object obj, String message)
:检查对象必须为另一个特定类型的实例
public void сhangeEngine(Engine engine) {
Assert.isInstanceOf(ToyotaEngine.class, engine);
// ToyotaEngine 是类 Engine的子类,可以通过
}
isAssignable(Class superType, Class subType, String message)
:subType 必须可以按类型匹配于 superType
2.2 文本断言
通常用来检查字符串参数。
- hasLength(String text, String message):当 text 为 null 或长度为 0 时抛出异常,空格算长度为1;
- hasText(String text, String message):text 不能为 null 且必须至少包含一个非空格的字符,否则抛出异常;
两者都区别:
hasLength(String text)文本为空格时不会抛出异常,但是hasText(String text)在空格的时候会抛出异常。
2.3 集合断言
- notEmpty(Collection collection, String message):当集合未包含元素时抛出异常。
三、同一异常捕获
因为Spring断言机制都会对未通过判断的地方抛出异常,所以,我们需要集中对这些异常进行捕获处理。我采用的是用AOP的方式,部分示例代码如下:
try {
...
} catch (IllegalArgumentException ill) {
logger.error(ill.getMessage());;
return null;
} catch (Throwable throwable) {
logger.error(throwable.getMessage());
return null;
}
关于aop的问题,参见SpringBoot (四) 配置 AOP 记录日志