欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實現(xiàn)表單必填參數(shù)驗證的方法

 更新時間:2021年05月13日 09:41:54   作者:任未然  
表單校驗是很多注冊時必做的功能, 一般我們的處理都是很粗暴的寫個if()判斷, 然后拋異常. 本文將介紹通過代理的思想, 用注解優(yōu)雅的處理非空判斷,感興趣的一起來了解一下

一. 概述

在開發(fā)后端接口, 通常都會涉及檢驗參數(shù)必填校驗, 一般我們的處理都是很粗暴的寫個if()判斷, 然后拋異常. 本文將介紹通過代理的思想, 用注解優(yōu)雅的處理非空判斷

二. 實現(xiàn)過程

最終想要的效果->在方法的參數(shù)加個注解或者參數(shù)的屬性里加個注解, 注解可以自定義報錯信息, 就可以實現(xiàn)自動非空校驗

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();
            // 方法參數(shù)注解類型
            Annotation[][] parameterAnnotations = signature.getMethod().getParameterAnnotations();
            // 方法參數(shù)的類型
            Class<?>[] parameterTypes = signature.getMethod().getParameterTypes();
            // 獲取方法參數(shù)
            Object[] args = pjp.getArgs();
            if(!ObjectUtils.isEmpty(args)){
                // 遍歷參數(shù)
                AtomicInteger index = new AtomicInteger(0);
                Arrays.stream(args).forEach(o -> {
                    int indexNo = index.getAndAdd(1);
                    /**
                     * 檢查方法參數(shù)非空
                     */
                    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);
                                // 檢查參數(shù)非空
                                Optional.ofNullable(o).
                                        filter(o1 -> !ObjectUtils.isEmpty(o1)).
                                        orElseThrow(()->new BaseException(localeMsg));
                            }
                        });
                    }

                    /**
                     * 檢查方法參數(shù)屬性非空
                     */
                    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("檢查參數(shù)aop報錯:"+e.getMessage());
            log.error("檢查參數(shù)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實現(xiàn)表單必填參數(shù)驗證的方法的文章就介紹到這了,更多相關java 表單必填參數(shù)驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解讀maven配置阿里云鏡像問題

    解讀maven配置阿里云鏡像問題

    這篇文章主要介紹了解讀maven配置阿里云鏡像問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java 實現(xiàn)將一個string保存到txt文檔中

    java 實現(xiàn)將一個string保存到txt文檔中

    今天小編就為大家分享一篇java 實現(xiàn)將一個string保存到txt文檔中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java notify和notifyAll的區(qū)別和相同

    Java notify和notifyAll的區(qū)別和相同

    本文主要介紹Java notify和notifyAll的知識,這里整理詳細的資料來說明notify 和NotifAll的區(qū)別,有需要的小伙伴可以參考下
    2016-09-09
  • Java如何優(yōu)雅地避免空指針異常(NullPointerException)

    Java如何優(yōu)雅地避免空指針異常(NullPointerException)

    這篇文章主要給大家介紹了關于Java如何優(yōu)雅地避免空指針異常(NullPointerException)的相關資料,空指針異常(NullPointerException)是一種常見的運行時異常,它在Java編程中經(jīng)常出現(xiàn),需要的朋友可以參考下
    2024-03-03
  • 簡單談談java中匿名內(nèi)部類構造函數(shù)

    簡單談談java中匿名內(nèi)部類構造函數(shù)

    這篇文章主要簡單給我們介紹了java中匿名內(nèi)部類構造函數(shù),并附上了簡單的示例,有需要的小伙伴可以參考下。
    2015-11-11
  • java單例五種實現(xiàn)模式解析

    java單例五種實現(xiàn)模式解析

    這篇文章主要介紹了java單例五種實現(xiàn)模式解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • 深入了解volatile和Java內(nèi)存模型

    深入了解volatile和Java內(nèi)存模型

    在本篇文章當中,主要給大家深入介紹Volatile關鍵字和Java內(nèi)存模型。在文章當中首先先介紹volatile的作用和Java內(nèi)存模型,然后層層遞進介紹實現(xiàn)這些的具體原理、JVM底層是如何實現(xiàn)volatile的和JVM實現(xiàn)的匯編代碼以及CPU內(nèi)部結構,感興趣的可以了解一下
    2022-08-08
  • Java工廠模式用法之如何動態(tài)選擇對象詳解

    Java工廠模式用法之如何動態(tài)選擇對象詳解

    工廠設計模式可能是最常用的設計模式之一,我想大家在自己的項目中都用到過。本文不僅僅是關于工廠模式的基本知識,更是討論如何在運行時動態(tài)選擇不同的方法進行執(zhí)行,你們可以看看是不是和你們項目中用的一樣
    2023-03-03
  • java 中使用匿名類直接new接口詳解及實例代碼

    java 中使用匿名類直接new接口詳解及實例代碼

    這篇文章主要介紹了java 中使用匿名類直接new接口詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • 詳解JavaEE中Apollo安裝使用小結

    詳解JavaEE中Apollo安裝使用小結

    這篇文章主要介紹了詳解JavaEE中Apollo安裝與使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論