java实现表单必填参数验证的方法

一. 概述

在开发后端接口, 通常都会涉及检验参数必填校验, 一般我们的处理都是很粗暴的写个if()判断, 然后抛异常. 本文将介绍通过代理的思想, 用注解优雅的处理非空判断

二. 实现过程

最终想要的效果->在方法的参数加个注解或者参数的属性里加个注解, 注解可以自定义报错信息, 就可以实现自动非空校验

2.1 编写注解

@Target({ElementType.FIELD})  //作用的位置
@Retention(RetentionPolicy.RUNTIME) //作用域
@Documented
public @interface NotNull {
    String value() default "{报错信息}";
}

说明: 该注解用来绑定某个必填属性

@Target({ElementType.TYPE,ElementType.METHOD})  //作用的位置
@Retention(RetentionPolicy.RUNTIME) //作用域
@Documented
public @interface CheckParam {
}

说明: 该注解用来绑定某个类或某个方法,作为校验代理拦截的标识

2.2 编写校验代理AOP

@Aspect
@Slf4j
public class CheckParamAop {
    @Around("@within(com.midea.cloud.common.annotation.CheckParam) || @annotation(com.midea.cloud.common.annotation.CheckParam)")
    public Object cacheClear(ProceedingJoinPoint pjp) throws Throwable {
        try {
            MethodSignature signature = (MethodSignature) pjp.getSignature();
            // 方法参数注解类型
            Annotation[][] parameterAnnotations = signature.getMethod().getParameterAnnotations();
            // 方法参数的类型
            Class<?>[] parameterTypes = signature.getMethod().getParameterTypes();
            // 获取方法参数
            Object[] args = pjp.getArgs();
            if(!ObjectUtils.isEmpty(args)){
                // 遍历参数
                AtomicInteger index = new AtomicInteger(0);
                Arrays.stream(args).forEach(o -> {
                    int indexNo = index.getAndAdd(1);
                    /**
                     * 检查方法参数非空
                     */
                    Annotation[] parameterAnnotation = parameterAnnotations[indexNo];
                    if(!ObjectUtils.isEmpty(parameterAnnotation)){
                        Arrays.stream(parameterAnnotation).forEach(annotation -> {
                            if(annotation instanceof NotNull){
                                NotNull notNull = (NotNull)annotation;
                                // 注解信息
                                String message = notNull.value();
                                // 通过工具类获取多语言信息
                                String localeMsg = LocaleHandler.getLocaleMsg(message);
                                // 检查参数非空
                                Optional.ofNullable(o).
                                        filter(o1 -> !ObjectUtils.isEmpty(o1)).
                                        orElseThrow(()->new BaseException(localeMsg));
                            }
                        });
                    }

                    /**
                     * 检查方法参数属性非空
                     */
                    Class<?> parameterType = parameterTypes[indexNo];
                    Field[] fields = parameterType.getDeclaredFields();
                    if(!ObjectUtils.isEmpty(fields)){
                        // 遍历属性
                        Arrays.stream(fields).forEach(field -> {
                            NotNull annotation = field.getAnnotation(NotNull.class);
                            if(null != annotation){
                                Object value = null;
                                // 注解信息
                                String message = annotation.value();
                                // 通过工具类获取多语言信息
                                String localeMsg = LocaleHandler.getLocaleMsg(message);
                                Optional.ofNullable(o).orElseThrow(()->new BaseException(localeMsg));
                                try {
                                    field.setAccessible(true);
                                    value = field.get(o);
                                } catch (Exception e) {
                                    log.error("获取属性值报错"+e.getMessage());
                                    log.error("获取属性值报错"+e);
                                }
                                // value为空时报错
                                Optional.ofNullable(value).
                                        filter(o1 -> !ObjectUtils.isEmpty(o1)).
                                        orElseThrow(()->new BaseException(localeMsg));
                            }
                        });
                    }
                });
            }
        } catch (BaseException e) {
            throw e;
        } catch (Exception e){
            log.error("检查参数aop报错:"+e.getMessage());
            log.error("检查参数aop报错:"+e);
        }
        return pjp.proceed();
    }
}

三. 使用示例

public class Test{
    @Data
    class Demo{
        @NotNull("名字不能为空!")
        private String name;
        private String sex;
        private Integer age;
    }

    @CheckParam
    public void testNoNullCheck1(Demo demo) {

    }
    @CheckParam
    public void testNoNullCheck2(@NotNull("user不能为空") User user) {

    }
}

到此这篇关于java实现表单必填参数验证的方法的文章就介绍到这了,更多相关java 表单必填参数验证内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java后台开发之表单提交之前验证

    废话不多说了,具体代码如下所示: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*" %> <%@ page import="java.sql.*" %> <!DOCTYPE html

  • java正则表达式表单验证类工具类(验证邮箱、手机号码、qq号码等)

    java使用正则表达式进行表单验证工具类,可以验证邮箱.手机号码.qq号码等 复制代码 代码如下: package util; import java.util.regex.Matcher;import java.util.regex.Pattern; /** * 使用正则表达式进行表单验证 *  */ public class RegexValidateUtil {    static boolean flag = false;    static String regex = ""

  • JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)

    问题:表单怎么在输入后立即验证,而不是提交后再验证那么不方便(网上搜到的要么是模棱两可,要么是残缺不全-) 方法:鉴于此,加上我个人的理解(注释)在上面. 截图: 代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户注册</title

  • 用JavaScrip正则表达式验证form表单的方法

    document:标签之间 location:url history:前进后退 <html> <head> <script type="text/javascript"> function show() { //弹出一个提示框 window.alert("hh"); } //将show方法绑定到按钮上 window.onload=function() { //定位到按钮 var buttonElement=document.for

  • 浅析RxJava处理复杂表单验证问题的方法

    无论是简单的登录页面,还是复杂的订单提交页面,表单的前端验证(比如登录名和密码都符合基本要求才能点亮登录按钮)都是必不可少的步骤.本文展示了如何用RxJava来方便的处理表单提交前的验证问题,例子采用了Android上的一个简单的登录页面 内容提要 传统的验证方式 combineLatest操作符 用combineLatest处理表单验证 combineLatest和zip的区别 本文中所演示的例子sample代码位于RxAndroidDemo,参见loginActivity这个文件 传统的验证

  • java实现表单必填参数验证的方法

    一. 概述 在开发后端接口, 通常都会涉及检验参数必填校验, 一般我们的处理都是很粗暴的写个if()判断, 然后抛异常. 本文将介绍通过代理的思想, 用注解优雅的处理非空判断 二. 实现过程 最终想要的效果->在方法的参数加个注解或者参数的属性里加个注解, 注解可以自定义报错信息, 就可以实现自动非空校验 2.1 编写注解 @Target({ElementType.FIELD}) //作用的位置 @Retention(RetentionPolicy.RUNTIME) //作用域 @Documen

  • js提交form表单,并传递参数的实现方法

    //增加的函数 begin function queryFun(){ var type = $("#artType").val(); var hasInputed = "1";//表示输入了要搜索 的信息 if($("#query").val()=="选手姓名/编号"){ //表示没有输入要搜索的值 hasInputed="0"; } document.getElementById("queryF

  • 对django2.0 关联表的必填on_delete参数的含义解析

    一对多(ForeignKey) class ForeignKey(ForeignObject): def __init__(self, to, on_delete, related_name=None, related_query_name=None, limit_choices_to=None, parent_link=False, to_field=None, db_constraint=True, **kwargs): super().__init__(to, on_delete, fro

  • BootStrap+Mybatis框架下实现表单提交数据重复验证

    效果: jsp页面: <form class="form-horizontal lui-tj-bd" id="dbc_code_add_form" method="post"> <div class="row"> <div class="col-xs-12"> <!-- PAGE CONTENT BEGINS --> <div class="t

  • JavaScript简单验证表单空值及邮箱格式的方法

    本文实例讲述了JavaScript简单验证表单空值及邮箱格式的方法.分享给大家供大家参考,具体如下: 运行效果图如下: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <meta http-equiv="

  • PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】

    本文实例讲述了PHP实现表单提交数据的验证处理功能.分享给大家供大家参考,具体如下: 防XSS攻击代码: /** * 安全过滤函数 * * @param $string * @return string */ function safe_replace($string) { $string = str_replace('%20','',$string); $string = str_replace('%27','',$string); $string = str_replace('%2527',

  • SpringMVC中使用bean来接收form表单提交的参数时的注意点

    这是前辈们对于SpringMVC接收表单数据记录下来的总结经验: SpringMVC接收页面表单参数 springmvc请求参数获取的几种方法 下面是我自己在使用时发现的,前辈们没有记录的细节和注意点: 使用bean来接收form表单提交的参数时,pojo中必须含有默认的(即空的)构造函数,同时,需要设置到bean中的变量必须有setter方法. 注:以下代码均为示例代码,非本人实际运行代码,请自行补充. 例如:我有一个bean类是User,具有变量username和password.同时,表单

  • java表单提交中文乱码的解决方法

    本文实例为大家分享了java表单提交中文乱码的解决方法,供大家参考,具体内容如下 主页index.xml <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>servlet演示</title> </head> <body> <h2&

  • SpringBoot基于SpringSecurity表单登录和权限验证的示例

    一.简介 上篇介绍了一个自己做的管理系统,最近空闲的时间自己在继续做,把之前登录时候自定义的拦截器过滤器换成了基于SpringSecurity来做,其中遇到了很多坑,总结下,大家有遇到类似问题的话就当是为大家闭坑吧. 二.项目实现功能和成果展示 首先来看下登录界面:这是我输入的一个正确的信息,点击登录后SpringSecurity会根据你输入的用户名和密码去验证是否正确,如果正确的话就去你定义的页面,我这里定义的是查询教师信息页面.来看下代码吧. 三.准备工作(前台页面.实体类) 实体类Teac

  • ASP中JavaScript处理复杂表单的生成与验证第1/3页

    这里所谓的复杂表单,是指表单中包含多种不同的输入类型,比如下拉列表框.单行文本.多行文本.数值等.在经常需要更换这类表单的场合,需要有一个表单的动态生成程序.本文介绍的正是这样一个系统,它以数据库保存表单定义数据,利用ASP脚本动态生成表单HTML代码以及验证表单输入的脚本. 一.定义数据库表结构 在Web上经常可以看到"每周调查"之类的表单,这就是一种需要经常更新的表单.如果有一个动态生成表单及其验证脚本的程序,可以大大减少制作这些表单的工作量. 在本文的动态表单生成与验证示例中,我

随机推荐