java實(shí)現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路
背景
開發(fā)中我們可能會(huì)遇到會(huì)頁面對(duì)應(yīng)的數(shù)據(jù)表量級(jí)較大、頁面查詢條件過多的情況,那么有時(shí)候我們可能會(huì)限制做查詢操作是必須選擇至少一個(gè)查詢條件。
頁面效果:
直接查詢會(huì)提示:
思路
我們考慮使用注解+切面的形式來實(shí)現(xiàn),用來確定哪些方法、哪些參數(shù)是需要做篩選和判斷的。
注解類:
用來標(biāo)識(shí)某個(gè)參數(shù)和某個(gè)類的切入點(diǎn)
/** * 用來標(biāo)識(shí)某個(gè)參數(shù)和某個(gè)類的切入點(diǎn) * @author zhouli * @Classname ConditionLimitAspect * @Date 2022/4/6 19:39 */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER, ElementType.METHOD}) public @interface ConditionLimit { /** * 限制條件最少個(gè)數(shù) * * @return */ int conditionNumberLimit() default 1; } /** * 用來標(biāo)識(shí)哪些字段用來統(tǒng)計(jì)查詢列 * @author zhouli * @Classname ConditionLimitAspect * @Date 2022/4/6 19:39 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ConditionField { }
切面類:
@Slf4j @Aspect @Component public class ConditionLimitAspect { @Around("execution(* com.p4.tp.system.modules.*.rest.*.*(..,@com.p4.tp.system.config.aop.ConditionLimit (*),..))") public Object doCheckCondition(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); Parameter[] parameters = method.getParameters(); for (int i = 0; i < parameters.length; i++) { //多個(gè)參數(shù)時(shí)循環(huán) ConditionLimit annotation = parameters[i].getAnnotation(ConditionLimit.class); if (annotation == null) { continue; } //設(shè)定的最小查詢列數(shù)量 int numberLimit = annotation.conditionNumberLimit(); Object[] args = point.getArgs(); Class<?> aClass =args[i].getClass(); Field[] declaredFields = aClass.getDeclaredFields(); //查詢條件計(jì)數(shù) int realNum = 0; for (Field field : declaredFields) { //獲取帶ConditionField注解的字段 ConditionField conditionField = field.getAnnotation(ConditionField.class); if (conditionField == null) { continue; } field.setAccessible(true); //獲取列值 Object value = field.get(args[i]); if (value == null) { continue; } try { //列舉三種情況 if (value instanceof String && StringUtils.isNotBlank((String) value)) { realNum++; } else if (value instanceof Collection && !CollectionUtils.isEmpty((Collection<?>) value)) { realNum++; } else if (value instanceof Date) { realNum++; } } catch (Exception e) { log.error("條件限定異常,", e); } } if (realNum < numberLimit) { log.info("查詢條件不足,請(qǐng)至少選擇或輸入" + numberLimit + "個(gè)查詢條件"); throw new BusinessException("查詢條件不足,請(qǐng)至少選擇或輸入" + numberLimit + "個(gè)查詢條件"); } } return point.proceed(); } }
使用
創(chuàng)建實(shí)體
@Data public class FlowCardInfoParam { @ConditionField private String iccId; @ConditionField private String termSn; @ConditionField private String imei; }
方法使用
@PostMapping("/getPage") public ResponseEntity<Object> getPage(@RequestBody @ConditionLimit FlowCardInfoParam param) { return new ResponseEntity<>(null, HttpStatus.OK); }
現(xiàn)在我們使用接口請(qǐng)求
第一次不填寫參數(shù)值:{}
,查看日志結(jié)果:
第二次填寫 iccId
值重新請(qǐng)求: {"iccId":"898604B11921D0192003"}
,我們就能看到直接放過進(jìn)行正常的業(yè)務(wù)調(diào)用了。
尾言
以上便是實(shí)現(xiàn)多查詢條件中必選至少一種字段值的一種思路,正常情況下我們沒有必要也沒有辦法枚舉出所有頁面中出現(xiàn)的所有必要的查詢條件,那么就可以考慮做找一個(gè)前置的統(tǒng)一處理方法。利用切面在進(jìn)入方法前就進(jìn)行判斷,該次請(qǐng)求是否符合接口最低的要求,更多關(guān)于java頁面多查詢條件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于SpringMVC接受JSON參數(shù)詳解及常見錯(cuò)誤總結(jié)
下面小編就為大家分享一篇基于SpringMVC接受JSON參數(shù)詳解及常見錯(cuò)誤總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟
這篇文章主要介紹了IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(J2EE方式)
WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù),本文給大家介紹了SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(J2EE方式),需要的朋友可以參考下2025-01-01Jpa?Specification如何實(shí)現(xiàn)and和or同時(shí)使用查詢
這篇文章主要介紹了Jpa?Specification如何實(shí)現(xiàn)and和or同時(shí)使用查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-04-04