Java项目开发我们会遇到大量的条件判断。我们频繁的写if条件看起来不够优雅,于是就出现断言工具,一行解决我们的条件判断的问题。

前置知识

不会的自行学习补充哦!

1、自定义异常:https://www.zanglikun.com/2299.html#%e8%87%aa%e5%ae%9a%e4%b9%89%e5%bc%82%e5%b8%b8

2、全局异常捕获:https://www.zanglikun.com/3169.html

操作

1、定义一个异常

public class BusinessException extends RuntimeException {
    public BusinessException(String message) {
        super(message);
    }
}

2、编写全局异常捕获

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.CannotAcquireLockException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author :zanglk
 * @DateTime :2021/3/11 13:54
 * @Description :AOP 思想 统一全局异常处理。MVC提供一个@ControllerAdvice注解去处理异常
 * @Notes :
 * 特别说明
 *  1、@ExceptionHandler支持多个异常数组。
 *  2、@ResponseStatus(value = HttpStatus.BAD_REQUEST) 用于指定响应码。当然也可以在方法的返回值设为ResponseEntity,在此对象指定响应吗。
 *  3、相同异常被捕获时,捕获方法在前面优先捕获。
 */
@ControllerAdvice // 如果需要关闭全局异常拦截,直接注释此注解即可
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);


    /**
     * 自定义异常捕获
     *
     * @param req 请求:可以记录一些穿参的内容,这里没用到。
     * @return 返回一个自定义字符串
     */
    @ExceptionHandler(value = {BusinessException.class, Exception.class})
    @ResponseBody
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) // 错误码:500
    public String BusinessException(HttpServletRequest req, BusinessException e) {
        logger.error("接收了一个业务操作的异常{}", e.getMessage());
        return "宝贝,你被我拦截了!";
    }
}

3、编写AssertUtils工具

import org.apache.commons.lang3.StringUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.util.Collection;

/**
 * @Author :zanglk
 * @DateTime :2022/11/9 00:47
 * @Description :本工具最初目的是减少手写if判断,为了结合更好的业务操作,添加异常类,然后全局异常管理。
 * @Notes :To change this template:Click IDEA-Preferences to search 'File Templates'
 */
public class AssertUtils {

    /**
     * 判断对象是非空,如果对象是空,就抛异常
     *
     * @param object       判断对象
     * @param errorMessage 异常提示信息
     */
    public static void notNull(@Nullable Object object, String errorMessage) {
        if (null == object) {
            throw new BusinessException(errorMessage);
        }
    }

    /**
     * 判读对象是不是空,如果是非空,就抛异常
     *
     * @param object       判断对象
     * @param errorMessage 异常提示信息
     */
    public static void isNull(@Nullable Object object, String errorMessage) {
        if (null != object) {
            throw new BusinessException(errorMessage);
        }
    }

    /**
     * 判断是否是真,如果对象是false,就抛出异常
     *
     * @param expression   判断对象
     * @param errorMessage 异常提示信息
     */
    public static void isTrue(boolean expression, String errorMessage) {
        if (!expression) {
            throw new BusinessException(errorMessage);
        }
    }

    /**
     * 判断是否是真,如果对象是false,就抛出异常。
     *
     * @param expression   判断对象
     * @param errorMessage 异常提示信息
     */
    public static void isTrue(Boolean expression, String errorMessage) {
        if (Boolean.FALSE.equals(expression)) {
            throw new BusinessException(errorMessage);
        }
    }

    /**
     * 判断集合是否有数据,如果没有数据,就抛出异常。
     *
     * @param collection   集合对象
     * @param errorMessage 错误提示信息
     */
    public static void notEmpty(@Nullable Collection<?> collection, String errorMessage) {
        if (CollectionUtils.isEmpty(collection)) {
            throw new BusinessException(errorMessage);
        }
    }

    /**
     * 判断集合是否有数据,如果没有数据,就抛出异常。 这里利用的是Spring自带的工具
     *
     * @param array        数组对象
     * @param errorMessage 错误提示信息
     */
    public static void notEmpty(@Nullable Object[] array, String errorMessage) {
        if (ObjectUtils.isEmpty(array)) {
            throw new BusinessException(errorMessage);
        }
    }

    /**
     * 判断字符串是否有效是真实的且非空格,如果无法满足,就抛出异常。 这里利用的是org.apache.commons.lang3的二次封装。
     *
     * @param word         数组对象
     * @param errorMessage 错误提示信息
     */
    public static void isNotBlank(String word, String errorMessage) {
        /**
         *   StringUtils.isBlank(null)      = true
         *   StringUtils.isBlank("")        = true
         *   StringUtils.isBlank(" ")       = true
         *   StringUtils.isBlank("bob")     = false
         *   StringUtils.isBlank("  bob  ") = false
         */
        if (StringUtils.isBlank(word)) {
            throw new BusinessException(errorMessage);
        }
    }
}

4、测试

@PostMapping("assert")
@ResponseBody
public String testAssertUtils(){
    AssertUtils.isNotBlank(" ", "XX 不允许为Blank");
    return "方法结束!";
}

控制态输出

2022-11-09 01:59:41.331 ERROR 86029 --- [nio-8081-exec-1] c.z.s.handler.GlobalExceptionHandler : 接收了一个业务操作的异常XX 不允许为Blank

完成🎉