利用guava的Preconditions类进行参数校验

1.作用

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

2.api介绍

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

仅有待校验的参数:抛出的异常中没有错误消息;
有一个Object对象作为额外参数:抛出的异常使用Object.toString() 作为错误消息;
*有一个String对象作为额外参数,还有一个Object[]参数,这两个参数也是适用于异常错误消息的,处理的方式类似于String.format将Object的参数按顺序替换掉String中的占位符(如%s)
(不包括额外参数)

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

3.实例

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

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("用户名或密码错误");
    }
    //…………………………………………省略业务逻辑…………………………………………
}

当使用了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,"用户名或密码错误");
       //…………………………………………省略业务逻辑…………………………………………
}

当参数增多怎么会办,要给客服端返回不同的msg和code
自定义一个自己的异常类

public class MyException extends RuntimeException{

    private static final long serialVersionUID = 1L;

    private String message;

    private Integer code;
}

自己改造的utils类

public class PreconditionUtils {
    /**
     * 判断字符串不能为空,若字符串为空则报异常
     * 
     * @param string
     *            待校验字符串
     * @param string
     *            标识字符串
     */
    public static void notEmpty(String string, int  code ,String msg) {
        try {
            Preconditions.checkState(!StringUtils.isEmpty(string));
        } catch (Exception e) {
                throw new MyException (msg, code);
        }

    }

}

判断

@RequestMapping("/login")
    public Map<String, Object> login(String userName,String password){
     Map<String, Object> rootJson = new HashMap<String, Object>(3);
       try {
            PreconditionUtils.notEmpty(userName, "-1","没有填写用户名");
            PreconditionUtils.notEmpty(password,"-2","没有输入密码");

        } catch (PreconditionException e) {
            rootJson.put("code", e.getCode());
            rootJson.put("msg", e.getMsg());
            //异常记录数据库
            return rootJson;
        }
}

猜你喜欢

转载自blog.csdn.net/u012526691/article/details/80483749