springboot如何忽略接收請求中的參數(shù)
一、場景說明
在一些開發(fā)場景中,特別是前后端分開開發(fā)的場景中,由于后端接口采用的VO接收前端請求傳遞的參數(shù),但是前端開發(fā)小伙伴可能會把vo中所有屬性不進行過濾就直接調(diào)用接口,這樣會導(dǎo)致后端api由于不需要某些字段而導(dǎo)致api運行失敗,比如:id字段等。
二、開發(fā)環(huán)境
- 開發(fā)工具:IDEA
- 開發(fā)語言:JAVA 1.8
- 開發(fā)環(huán)境:Springboot 2.4.13
三、實現(xiàn)思路
- 使用Java的注解技術(shù),定義一個ReceiveIgnoreParam注解,作用在Controller的需要忽略接收屬性的方法上。
- 通過spring切面編程技術(shù)來實現(xiàn)對方法注解的操作,其判斷方法參數(shù)中是否包含需要忽略的屬性,如果存在直接設(shè)置為null或者空串
四、具體實現(xiàn)
- 注解類代碼
package com.rewloc.annotation;
import java.lang.annotation.*;
/**
* 類描述:忽略接收參數(shù) 注解
*
* @date 2022/5/9 10:54
* @slogan 設(shè)計就是代碼,代碼就是設(shè)計
* @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è)計就是代碼,代碼就是設(shè)計
* @since JDK 8
*/
@Aspect
@Component
public class ReceiveIgnoreParamAop {
private static final String ID = "id";
/**
* 方法描述: 切面攔截器
*
* @slogan 設(shè)計就是代碼,代碼就是設(shè)計
*/
@Pointcut("@annotation(com.rewloc.ReceiveIgnoreParam)")
private void ignoreReceiveParam() {
}
/**
* 方法描述: 忽略屬性值攔截處理
*
* @param point 環(huán)繞通知處理對象
* @return {@link Object}
* @slogan 設(shè)計就是代碼,代碼就是設(shè)計
*/
@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) {
// 對需要忽略的屬性進行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)繁忙,請稍后再試!");
}
}
/**
* 方法描述: 情況屬性的值
*
* @param obj 參數(shù)對象
* @param fieldName 字段名稱
* @return {@link Object}
* @slogan 設(shè)計就是代碼,代碼就是設(shè)計
*/
private void cleanValue(Object obj, String fieldName) throws IllegalAccessException {
// 獲取參數(shù)對象
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è)計就是代碼,代碼就是設(shè)計
* @since JDK 8
*/
@RestController
@RequestMapping("/receive/ignoreParam")
public class ReceiveIgnoreParamController {
/**
* 分頁獲取查詢列表
*
* @param vo 接收查詢參數(shù)的VO對象
* @return Result
*/
@PostMapping("/hello")
@ReceiveIgnoreParam(fieldName = {"id", "name"})
public String selectPage(ReceiveIgnoreParamVO vo) {
// 將當(dāng)前vo對象返回
return JSONObject.toJSONString(vo);
}
}五、總結(jié)
只要注解和spring切面結(jié)合可以做很多事情。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談常用Java數(shù)據(jù)庫連接池(小結(jié))
這篇文章主要介紹了淺談常用Java數(shù)據(jù)庫連接池(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Spring?Boot?4.0對于Java開發(fā)的影響和前景
探索Spring?Boot?4.0如何徹底革新Java開發(fā),提升效率并開拓未來可能性!別錯過這篇緊湊的指南,它帶你領(lǐng)略Spring?Boot的強大魅力和潛力,準(zhǔn)備好了嗎?2024-02-02
關(guān)于SpringBoot微服務(wù)發(fā)布與部署的三種方式
SpringBoot 框架只提供了一套基于可執(zhí)行 jar 包(executable jar)格式的標(biāo)準(zhǔn)發(fā)布形式,但并沒有對部署做過多的界定,而且為了簡化可執(zhí)行 jar 包的生成,SpringBoot 提供了相應(yīng)的 Maven 項目插件,需要的朋友可以參考下2023-05-05
myeclipse智能提示設(shè)置的實現(xiàn)方法
本篇文章介紹了,myeclipse智能提示設(shè)置的實現(xiàn)方法。需要的朋友參考下2013-05-05
java實現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享
這篇文章主要介紹了java實現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享,本文中使用的是QQ在線接口,也可以使用新浪、淘寶等提供的在線接口,需要的朋友可以參考下2014-08-08

