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

springboot如何忽略接收請(qǐng)求中的參數(shù)

 更新時(shí)間:2024年07月16日 09:58:08   作者:Rewloc  
這篇文章主要介紹了springboot如何忽略接收請(qǐng)求中的參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、場(chǎng)景說明

在一些開發(fā)場(chǎng)景中,特別是前后端分開開發(fā)的場(chǎng)景中,由于后端接口采用的VO接收前端請(qǐng)求傳遞的參數(shù),但是前端開發(fā)小伙伴可能會(huì)把vo中所有屬性不進(jìn)行過濾就直接調(diào)用接口,這樣會(huì)導(dǎo)致后端api由于不需要某些字段而導(dǎo)致api運(yùn)行失敗,比如:id字段等。

二、開發(fā)環(huán)境

  • 開發(fā)工具:IDEA
  • 開發(fā)語言:JAVA 1.8
  • 開發(fā)環(huán)境:Springboot 2.4.13

三、實(shí)現(xiàn)思路

  • 使用Java的注解技術(shù),定義一個(gè)ReceiveIgnoreParam注解,作用在Controller的需要忽略接收屬性的方法上。
  • 通過spring切面編程技術(shù)來實(shí)現(xiàn)對(duì)方法注解的操作,其判斷方法參數(shù)中是否包含需要忽略的屬性,如果存在直接設(shè)置為null或者空串

四、具體實(shí)現(xiàn)

  • 注解類代碼
package com.rewloc.annotation;

import java.lang.annotation.*;

/**
 * 類描述:忽略接收參數(shù) 注解
 *
 * @date 2022/5/9 10:54
 * @slogan 設(shè)計(jì)就是代碼,代碼就是設(shè)計(jì)
 * @since JDK 8
 */
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.METHOD)
public @interface ReceiveIgnoreParam {
    /** 字段名數(shù)組 */
    String[] fieldName();
}
  • 切面類代碼
package com.rewloc.aop;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.BooleanUtil;
import com.rewloc.annotation.ReceiveIgnoreParam;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.Arrays;

/**
 * 類描述:忽略接收參數(shù) 切面類
 *
 * @slogan 設(shè)計(jì)就是代碼,代碼就是設(shè)計(jì)
 * @since JDK 8
 */
@Aspect
@Component
public class ReceiveIgnoreParamAop {
    private static final String ID = "id";

    /**
     * 方法描述: 切面攔截器
     *
     * @slogan 設(shè)計(jì)就是代碼,代碼就是設(shè)計(jì)
     */
    @Pointcut("@annotation(com.rewloc.ReceiveIgnoreParam)")
    private void ignoreReceiveParam() {
    }

    /**
     * 方法描述: 忽略屬性值攔截處理
     *
     * @param point 環(huán)繞通知處理對(duì)象
     * @return {@link Object}
     * @slogan 設(shè)計(jì)就是代碼,代碼就是設(shè)計(jì)
     */
    @Around(value = "ignoreReceiveParam()")
    public Object doAround(ProceedingJoinPoint point) {
        try {
            // 獲取注解信息
            MethodSignature methodSignature = (MethodSignature) point.getSignature();
            ReceiveIgnoreParam ignoreReceiveParam = methodSignature.getMethod().getAnnotation(ReceiveIgnoreParam.class);
            // 獲取方法的參數(shù)
            Object[] args = point.getArgs();
            // 循環(huán)返回參數(shù),
            for (Object arg : args) {
                // 對(duì)需要忽略的屬性進(jìn)行null賦值 
                Arrays.stream(ignoreReceiveParam.fieldName()).forEach(field -> {
                    try {
                        // 清空忽略屬性的值
                        cleanValue(arg, field);
                    } catch (Exception e) {
                    }
                });
            }
            return point.proceed(args);
        } catch (Throwable e) {
            throw new RuntimeException("系統(tǒng)繁忙,請(qǐng)稍后再試!");
        }
    }

    /**
     * 方法描述: 情況屬性的值
     *
     * @param obj       參數(shù)對(duì)象
     * @param fieldName 字段名稱
     * @return {@link Object}
     * @slogan 設(shè)計(jì)就是代碼,代碼就是設(shè)計(jì)
     */
    private void cleanValue(Object obj, String fieldName) throws IllegalAccessException {
        // 獲取參數(shù)對(duì)象
        Class<?> aClass = obj.getClass();
        // 獲取class中的所有字段
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            // 如果是需要忽略的字段,賦null值
            if (fieldName.equals(field.getName())) {
                field.setAccessible(true);
                field.set(obj, null);
            }
        }
    }
}
  • vo類
package com.rewloc.vo

import lombok.Data;

@Data
public class ReceiveIgnoreParamVO {
    private String id;
    private String name;
    private String sex;
    private int age;
    private String birthdate;
}
  • 注解使用
package com.rewloc.web;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 類描述:忽略接收參數(shù) controller類
 *
 * @slogan 設(shè)計(jì)就是代碼,代碼就是設(shè)計(jì)
 * @since JDK 8
 */
@RestController
@RequestMapping("/receive/ignoreParam")
public class ReceiveIgnoreParamController {
    /**
     * 分頁獲取查詢列表
     *
     * @param vo    接收查詢參數(shù)的VO對(duì)象
     * @return Result
     */
    @PostMapping("/hello")
    @ReceiveIgnoreParam(fieldName = {"id", "name"})
    public String selectPage(ReceiveIgnoreParamVO vo) {
        // 將當(dāng)前vo對(duì)象返回
        return JSONObject.toJSONString(vo);
    }
}

五、總結(jié)

只要注解和spring切面結(jié)合可以做很多事情。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談常用Java數(shù)據(jù)庫連接池(小結(jié))

    淺談常用Java數(shù)據(jù)庫連接池(小結(jié))

    這篇文章主要介紹了淺談常用Java數(shù)據(jù)庫連接池(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • java調(diào)用外部程序的方法及代碼演示

    java調(diào)用外部程序的方法及代碼演示

    這篇文章主要介紹了java調(diào)用外部程序的方法及代碼演示的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Java簡(jiǎn)單幾步實(shí)現(xiàn)一個(gè)二叉搜索樹

    Java簡(jiǎn)單幾步實(shí)現(xiàn)一個(gè)二叉搜索樹

    二叉樹包含了根節(jié)點(diǎn),孩子節(jié)點(diǎn),葉節(jié)點(diǎn),每一個(gè)二叉樹只有一個(gè)根節(jié)點(diǎn),每一個(gè)結(jié)點(diǎn)最多只有兩個(gè)節(jié)點(diǎn),左子樹的鍵值小于根的鍵值,右子樹的鍵值大于根的鍵值,下面這篇文章主要給大家介紹了關(guān)于如何在Java中實(shí)現(xiàn)二叉搜索樹的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Spring?Boot?4.0對(duì)于Java開發(fā)的影響和前景

    Spring?Boot?4.0對(duì)于Java開發(fā)的影響和前景

    探索Spring?Boot?4.0如何徹底革新Java開發(fā),提升效率并開拓未來可能性!別錯(cuò)過這篇緊湊的指南,它帶你領(lǐng)略Spring?Boot的強(qiáng)大魅力和潛力,準(zhǔn)備好了嗎?
    2024-02-02
  • Java過濾器@WebFilter用法詳解

    Java過濾器@WebFilter用法詳解

    @WebFilter用于將一個(gè)類聲明為過濾器,該注解將會(huì)在部署時(shí)被容器處理,容器將根據(jù)具體的屬性配置將相應(yīng)的類部署為過濾器,這篇文章主要給大家介紹了關(guān)于Java過濾器@WebFilter用法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • JavaWeb中的Response常用方法解析

    JavaWeb中的Response常用方法解析

    這篇文章主要介紹了JavaWeb中的Response常用方法解析,response對(duì)象是用來對(duì)客戶端進(jìn)行響應(yīng)的當(dāng)瀏覽器發(fā)出請(qǐng)求時(shí),?Web容器創(chuàng)建一個(gè)ServletRequest對(duì)象封裝請(qǐng)求信息,一個(gè)ServletResponse對(duì)象封裝響應(yīng)信息,對(duì)象作為Servlet的service()方法中的參數(shù),需要的朋友可以參考下
    2023-11-11
  • 深入理解Java中的String(示例詳解)

    深入理解Java中的String(示例詳解)

    文章詳細(xì)介紹了Java中String類的特點(diǎn)、用途、主要方法以及常見用法,String類是不可變的,具有字符串常量池,特定的內(nèi)存結(jié)構(gòu),并隨JDK版本更新而優(yōu)化,它廣泛用于表示和處理文本數(shù)據(jù),并在內(nèi)存管理和性能優(yōu)化方面表現(xiàn)出色,感興趣的朋友一起看看吧
    2025-03-03
  • 關(guān)于SpringBoot微服務(wù)發(fā)布與部署的三種方式

    關(guān)于SpringBoot微服務(wù)發(fā)布與部署的三種方式

    SpringBoot 框架只提供了一套基于可執(zhí)行 jar 包(executable jar)格式的標(biāo)準(zhǔn)發(fā)布形式,但并沒有對(duì)部署做過多的界定,而且為了簡(jiǎn)化可執(zhí)行 jar 包的生成,SpringBoot 提供了相應(yīng)的 Maven 項(xiàng)目插件,需要的朋友可以參考下
    2023-05-05
  • myeclipse智能提示設(shè)置的實(shí)現(xiàn)方法

    myeclipse智能提示設(shè)置的實(shí)現(xiàn)方法

    本篇文章介紹了,myeclipse智能提示設(shè)置的實(shí)現(xiàn)方法。需要的朋友參考下
    2013-05-05
  • java實(shí)現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享

    java實(shí)現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享

    這篇文章主要介紹了java實(shí)現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享,本文中使用的是QQ在線接口,也可以使用新浪、淘寶等提供的在線接口,需要的朋友可以參考下
    2014-08-08

最新評(píng)論