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-07Spring?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-05myeclipse智能提示設(shè)置的實現(xiàn)方法
本篇文章介紹了,myeclipse智能提示設(shè)置的實現(xiàn)方法。需要的朋友參考下2013-05-05java實現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享
這篇文章主要介紹了java實現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享,本文中使用的是QQ在線接口,也可以使用新浪、淘寶等提供的在線接口,需要的朋友可以參考下2014-08-08