springboot如何忽略接收請(qǐng)求中的參數(shù)
一、場(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)文章
詳解SpringBoot如何實(shí)現(xiàn)整合微信登錄
本文主要介紹了SpringBoot實(shí)現(xiàn)整合微信登錄的過程詳解,文中的示例代碼介紹的非常詳細(xì),對(duì)我們的學(xué)習(xí)過工作有一定的參考價(jià)值,需要的朋友可以關(guān)注下2021-12-12
JAVA TIMER簡(jiǎn)單用法學(xué)習(xí)
Timer類是用來執(zhí)行任務(wù)的類,它接受一個(gè)TimerTask做參數(shù)2013-07-07
Java的Hibernate框架中一對(duì)多的單向和雙向關(guān)聯(lián)映射
建立對(duì)SQL語句的映射是Hibernate框架操作數(shù)據(jù)庫的主要手段,這里我們列舉實(shí)例來為大家講解Java的Hibernate框架中一對(duì)多的單向和雙向關(guān)聯(lián)映射2016-06-06
SpringBoot中的@ConditionalOnBean注解用法解讀
本文介紹了SpringBoot中的@ConditionalOnBean條件注解,詳細(xì)講解了它的作用、基本用法、屬性、使用場(chǎng)景以及與@ConditionalOnMissingBean的區(qū)別,通過多個(gè)示例,幫助讀者更好地理解和應(yīng)用@ConditionalOnBean2026-02-02
關(guān)于mybatis遇到Integer類型的參數(shù)時(shí)動(dòng)態(tài)sql需要注意條件
這篇文章主要介紹了關(guān)于mybatis遇到Integer類型的參數(shù)時(shí)動(dòng)態(tài)sql需要注意條件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
java構(gòu)建Stream流的多種方式總結(jié)
Java?8引入了Stream流作為一項(xiàng)新的特性,它是用來處理集合數(shù)據(jù)的一種函數(shù)式編程方式,本文為大家整理了多種java構(gòu)建Stream流的方式,希望對(duì)大家有所幫助2023-11-11
JavaWeb?Listener?利用Session統(tǒng)計(jì)在線人數(shù)
這篇文章主要為大家介紹了JavaWeb?Listener?利用Session統(tǒng)計(jì)在線人數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
SpringBoot中集成Redis進(jìn)行緩存的實(shí)現(xiàn)
本文主要介紹了SpringBoot中集成Redis進(jìn)行緩存的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-06-06
Java鏈表元素查找實(shí)現(xiàn)原理實(shí)例解析
這篇文章主要介紹了Java鏈表元素查找實(shí)現(xiàn)原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07

