最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一. 概述

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

二. 實(shí)現(xiàn)過(guò)程

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

2.1 編寫(xiě)注解

@Target({ElementType.FIELD})  //作用的位置
@Retention(RetentionPolicy.RUNTIME) //作用域
@Documented
public @interface NotNull {
    String value() default "{報(bào)錯(cuò)信息}";
}

說(shuō)明: 該注解用來(lái)綁定某個(gè)必填屬性

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

說(shuō)明: 該注解用來(lái)綁定某個(gè)類(lèi)或某個(gè)方法,作為校驗(yàn)代理攔截的標(biāo)識(shí)

2.2 編寫(xiě)校驗(yàn)代理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ù)注解類(lèi)型
            Annotation[][] parameterAnnotations = signature.getMethod().getParameterAnnotations();
            // 方法參數(shù)的類(lèi)型
            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();
                                // 通過(guò)工具類(lèi)獲取多語(yǔ)言信息
                                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();
                                // 通過(guò)工具類(lèi)獲取多語(yǔ)言信息
                                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("獲取屬性值報(bào)錯(cuò)"+e.getMessage());
                                    log.error("獲取屬性值報(bào)錯(cuò)"+e);
                                }
                                // value為空時(shí)報(bào)錯(cuò)
                                Optional.ofNullable(value).
                                        filter(o1 -> !ObjectUtils.isEmpty(o1)).
                                        orElseThrow(()->new BaseException(localeMsg));
                            }
                        });
                    }
                });
            }
        } catch (BaseException e) {
            throw e;
        } catch (Exception e){
            log.error("檢查參數(shù)aop報(bào)錯(cuò):"+e.getMessage());
            log.error("檢查參數(shù)aop報(bào)錯(cuò):"+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) {

    }
}

到此這篇關(guān)于java實(shí)現(xiàn)表單必填參數(shù)驗(yàn)證的方法的文章就介紹到這了,更多相關(guān)java 表單必填參數(shù)驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring中@autowired、@Qualifier、@Primary注解的使用說(shuō)明

    spring中@autowired、@Qualifier、@Primary注解的使用說(shuō)明

    這篇文章主要介紹了spring中@autowired、@Qualifier、@Primary注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot使用@Cacheable出現(xiàn)預(yù)覽工具亂碼的解決方法

    SpringBoot使用@Cacheable出現(xiàn)預(yù)覽工具亂碼的解決方法

    直接使用注解進(jìn)行緩存數(shù)據(jù),我們?cè)偈褂霉ぞ呷ヮA(yù)覽存儲(chǔ)的數(shù)據(jù)時(shí)發(fā)現(xiàn)是亂碼,這是由于默認(rèn)序列化的問(wèn)題,所以接下來(lái)將給大家介紹一下SpringBoot使用@Cacheable出現(xiàn)預(yù)覽工具亂碼的解決方法,需要的朋友可以參考下
    2023-10-10
  • mybatisplus開(kāi)啟sql打印的三種方式匯總

    mybatisplus開(kāi)啟sql打印的三種方式匯總

    這篇文章主要介紹了mybatisplus開(kāi)啟sql打印的三種方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • JAVA異常處理機(jī)制之throws/throw使用情況

    JAVA異常處理機(jī)制之throws/throw使用情況

    這篇文章主要介紹了JAVA異常處理機(jī)制之throws/throw使用情況的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解將Eclipse代碼導(dǎo)入到AndroidStudio的兩種方式

    詳解將Eclipse代碼導(dǎo)入到AndroidStudio的兩種方式

    本篇文章主要介紹了詳解將Eclipse代碼導(dǎo)入到AndroidStudio的兩種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Spring MVC Controller返回值及異常的統(tǒng)一處理方法

    Spring MVC Controller返回值及異常的統(tǒng)一處理方法

    這篇文章主要給大家介紹了關(guān)于Spring MVC Controller返回值及異常的統(tǒng)一處理方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring MVC具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java中的Map集合簡(jiǎn)單匯總解析

    Java中的Map集合簡(jiǎn)單匯總解析

    這篇文章主要介紹了Java中的Map集合簡(jiǎn)單匯總解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Spring的BeanFactoryPostProcessor接口示例代碼詳解

    Spring的BeanFactoryPostProcessor接口示例代碼詳解

    這篇文章主要介紹了Spring的BeanFactoryPostProcessor接口,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • JavaWeb入門(mén)教程之分頁(yè)查詢(xún)功能的簡(jiǎn)單實(shí)現(xiàn)

    JavaWeb入門(mén)教程之分頁(yè)查詢(xún)功能的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了JavaWeb入門(mén)教程之分頁(yè)查詢(xún)功能的簡(jiǎn)單實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • springboot?Minio功能實(shí)現(xiàn)代碼

    springboot?Minio功能實(shí)現(xiàn)代碼

    這篇文章主要介紹了springboot?Minio功能實(shí)現(xiàn),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

南雄市| 鹤岗市| 禹城市| 贺兰县| 西贡区| 石城县| 永靖县| 哈尔滨市| 青河县| 通辽市| 长汀县| 大渡口区| 碌曲县| 凤台县| 株洲县| 类乌齐县| 康保县| 嘉禾县| 新田县| 宝坻区| 桃江县| 长乐市| 榆中县| 牟定县| 庆云县| 北流市| 罗定市| 九江市| 东城区| 绥宁县| 灵石县| 虹口区| 喀什市| 元谋县| 太白县| 霍山县| 江达县| 时尚| 鄂尔多斯市| 剑川县| 米易县|