使用注解统一校验参数非空

news/2024/5/19 5:44:20 标签: 注解, 反射, 参数校验

可修改做工具类

代码:

1. 待校验类:

public class User {

    @NonNull(content = "姓名不能为空", minLen = 2, maxLen = 100)
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2. 注解

@Documented
@Target(value = ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface NonNull {

    String name() default "";

    String content() default "";

    int maxLen() default 50;

    int minLen() default 1;
}

3. 校验

    public void test() {
        User user = new User();
        user.setName("老王");
        try {
            valid(user);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    private <T> void valid(T user) throws IllegalAccessException, InvocationTargetException {
        Class<?> clazz = user.getClass();
        Field[] declaredFields = clazz.getDeclaredFields();
        Method[] methods = clazz.getMethods();
        for (Field field : declaredFields) {
            validParams(user, methods, field);
        }
        System.out.println("==========参数校验通过=========");
    }

    private <T> void validParams(T user, Method[] methods, Field field) throws IllegalAccessException, InvocationTargetException {
        NonNull annotation = field.getAnnotation(NonNull.class);
        String fieldName;
        if (StringUtils.isNotBlank(annotation.name())) {
            fieldName = annotation.name();
        } else {
            fieldName = field.getName();
        }
        for (Method method : methods) {
            if (("get" + fieldName).toLowerCase().equals(method.getName().toLowerCase())) {
                Object getMethodResult = method.invoke(user, null);
                if (getMethodResult == null) {
                    System.out.println("==========非Null校验失败=========");
                    throw new IllegalArgumentException("[" + annotation.content() + "]为null");
                }
                if (getMethodResult instanceof String) {
                    if (StringUtils.isBlank(String.valueOf(getMethodResult))) {
                        System.out.println("==========非空校验失败=========");
                        throw new IllegalArgumentException("[" + annotation.content() + "]为空");
                    }
                    System.out.println(fieldName + "长度:" + String.valueOf(getMethodResult).length());
                    if (String.valueOf(getMethodResult).length() > annotation.maxLen()) {
                        System.out.println("==========长度超出指定范围=========");
                        throw new IllegalArgumentException("[" + fieldName + "]长度超出");
                    }
                    if (String.valueOf(getMethodResult).length() < annotation.minLen()) {
                        System.out.println("==========长度小于指定范围=========");
                        throw new IllegalArgumentException("[" + fieldName + "]长度不够");
                    }
                }
            }
        }
    }

结果参考:

name长度:2
==========参数校验通过=========
name长度:2
==========长度小于指定范围=========

 


http://www.niftyadmin.cn/n/1307148.html

相关文章

网络原因等需要重试服务的几种方法

动态代理(目标类需实现接口) public class DynamicProxy implements InvocationHandler {private final Object subject;private static final int RETRY_MAX_COUNT = 3;public DynamicProxy(Object subject) {this.subject = subject;}@Overridepublic Object invoke(Object p…

Flex样式-HDividedBox篇

HDividedBox {dividerAffordance: 30;dividerAlpha: 0.77;dividerColor: #ff0000;dividerThickness: 30; }

office所有后缀对应的content-type

后缀 MIME Type .doc application/msword .dot application/msword .docx application/vnd.openxmlformats-officedocument.wordprocessingml.document .dotx application/vnd.openxmlformats-officedocument.wordprocessingml.template .docm application/v…

Flex样式-VDividedBox篇

VDividedBox {dividerAffordance: 15;dividerAlpha: 0.56;dividerColor: #cc3333;dividerThickness: 11; }

图片放大镜的实现

图片放大镜的实现(支持旋转) 功能介绍&#xff1a; 模拟圆形放大镜效果支持图片旋转/翻转后的放大 显示效果&#xff1a; 场景&#xff1a; 图片查看一般引入了插件&#xff08;可旋转/翻转等&#xff09;&#xff0c;blowup.js文件需要获取旋转参数值&#xff0c;所以需要修…

理解static的加载顺序

理解static的加载顺序 测试类&#xff1a; public class StaticDemo {/*** 静态变量/静态代码块 -> 非静态变量/非静态代码块 -> 构造方法*/public static int k 0;public static StaticDemo t1 new StaticDemo("t1");public static StaticDemo t2 new St…

Linux命令学习-less/more/tail/head

Linux命令学习-less/more/tail/head less从后向前查看日志 less logs/catalina.out q 退出less命令 g 移动到第一行 G 移动到最后一行 ctrl B 查看向上一屏; ctrl U 半屏 ctrl F 查看向下一屏; ctrl D 半屏 j 查看向下一行 k 查看向上一行 more more 20 file 第…

设计模式-多重if的应用

设计模式-多重if的应用 文章目录设计模式-多重if的应用多重if代码示例改进代码参考资料策略模式改进多重if结构 多重if代码示例 /*** 支付方式** author admin*/ enum PayEnum {/*** 支付宝*/ALI_PAY("ali", "支付宝支付"),/*** 微信*/WECHAT_PAY("w…