springboot如何忽略接收請(qǐng)求中的參數(shù)
一、場(chǎng)景說(shuō)明
在一些開(kāi)發(fā)場(chǎng)景中,特別是前后端分開(kāi)開(kāi)發(fā)的場(chǎng)景中,由于后端接口采用的VO接收前端請(qǐng)求傳遞的參數(shù),但是前端開(kāi)發(fā)小伙伴可能會(huì)把vo中所有屬性不進(jìn)行過(guò)濾就直接調(diào)用接口,這樣會(huì)導(dǎo)致后端api由于不需要某些字段而導(dǎo)致api運(yùn)行失敗,比如:id字段等。
二、開(kāi)發(fā)環(huán)境
- 開(kāi)發(fā)工具:IDEA
- 開(kāi)發(fā)語(yǔ)言:JAVA 1.8
- 開(kāi)發(fā)環(huán)境:Springboot 2.4.13
三、實(shí)現(xiàn)思路
- 使用Java的注解技術(shù),定義一個(gè)ReceiveIgnoreParam注解,作用在Controller的需要忽略接收屬性的方法上。
- 通過(guò)spring切面編程技術(shù)來(lái)實(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 {
/**
* 分頁(yè)獲取查詢列表
*
* @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ù)庫(kù)連接池(小結(jié))
這篇文章主要介紹了淺談常用Java數(shù)據(jù)庫(kù)連接池(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Java簡(jiǎn)單幾步實(shí)現(xiàn)一個(gè)二叉搜索樹(shù)
二叉樹(shù)包含了根節(jié)點(diǎn),孩子節(jié)點(diǎn),葉節(jié)點(diǎn),每一個(gè)二叉樹(shù)只有一個(gè)根節(jié)點(diǎn),每一個(gè)結(jié)點(diǎn)最多只有兩個(gè)節(jié)點(diǎn),左子樹(shù)的鍵值小于根的鍵值,右子樹(shù)的鍵值大于根的鍵值,下面這篇文章主要給大家介紹了關(guān)于如何在Java中實(shí)現(xiàn)二叉搜索樹(shù)的相關(guān)資料,需要的朋友可以參考下2023-02-02
Spring?Boot?4.0對(duì)于Java開(kāi)發(fā)的影響和前景
探索Spring?Boot?4.0如何徹底革新Java開(kāi)發(fā),提升效率并開(kāi)拓未來(lái)可能性!別錯(cuò)過(guò)這篇緊湊的指南,它帶你領(lǐng)略Spring?Boot的強(qiáng)大魅力和潛力,準(zhǔn)備好了嗎?2024-02-02
關(guān)于SpringBoot微服務(wù)發(fā)布與部署的三種方式
SpringBoot 框架只提供了一套基于可執(zhí)行 jar 包(executable jar)格式的標(biāo)準(zhǔn)發(fā)布形式,但并沒(méi)有對(duì)部署做過(guò)多的界定,而且為了簡(jiǎn)化可執(zhí)行 jar 包的生成,SpringBoot 提供了相應(yīng)的 Maven 項(xiàng)目插件,需要的朋友可以參考下2023-05-05
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地址獲取地理位置的代碼分享,本文中使用的是QQ在線接口,也可以使用新浪、淘寶等提供的在線接口,需要的朋友可以參考下2014-08-08

