java实现页面多查询条件必选的统一处理思路

 更新时间:2023年06月15日 17:20:52   作者:我是一颗小虎牙_  
这篇文章主要为大家介绍了java实现页面多查询条件必选的统一处理思路详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

开发中我们可能会遇到会页面对应的数据表量级较大、页面查询条件过多的情况,那么有时候我们可能会限制做查询操作是必须选择至少一个查询条件。

页面效果:

直接查询会提示:

思路

我们考虑使用注解+切面的形式来实现,用来确定哪些方法、哪些参数是需要做筛选和判断的。

注解类:

用来标识某个参数和某个类的切入点

/**
 * 用来标识某个参数和某个类的切入点
 * @author zhouli
 * @Classname ConditionLimitAspect
 * @Date 2022/4/6 19:39
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD})
public @interface ConditionLimit {
    /**
     * 限制条件最少个数
     *
     * @return
     */
    int conditionNumberLimit() default 1;
}
/**
 * 用来标识哪些字段用来统计查询列
 * @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++) {
            //多个参数时循环
            ConditionLimit annotation = parameters[i].getAnnotation(ConditionLimit.class);
            if (annotation == null) {
                continue;
            }
            //设定的最小查询列数量
            int numberLimit = annotation.conditionNumberLimit();
            Object[] args = point.getArgs();
            Class<?> aClass =args[i].getClass();
            Field[] declaredFields = aClass.getDeclaredFields();
            //查询条件计数
            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("查询条件不足,请至少选择或输入" + numberLimit + "个查询条件");
                throw new BusinessException("查询条件不足,请至少选择或输入" + numberLimit + "个查询条件");
            }
        }
        return point.proceed();
    }
}

使用

创建实体

@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);
    }

现在我们使用接口请求

第一次不填写参数值:{} ,查看日志结果:

第二次填写 iccId 值重新请求: {"iccId":"898604B11921D0192003"},我们就能看到直接放过进行正常的业务调用了。

尾言

以上便是实现多查询条件中必选至少一种字段值的一种思路,正常情况下我们没有必要也没有办法枚举出所有页面中出现的所有必要的查询条件,那么就可以考虑做找一个前置的统一处理方法。利用切面在进入方法前就进行判断,该次请求是否符合接口最低的要求,更多关于java页面多查询条件的资料请关注脚本之家其它相关文章!

相关文章

  • 基于SpringMVC接受JSON参数详解及常见错误总结

    基于SpringMVC接受JSON参数详解及常见错误总结

    下面小编就为大家分享一篇基于SpringMVC接受JSON参数详解及常见错误总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • IDEA设置JVM运行参数的方法步骤

    IDEA设置JVM运行参数的方法步骤

    这篇文章主要介绍了IDEA设置JVM运行参数的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot+WebSocket实现即时通讯功能(J2EE方式)

    SpringBoot+WebSocket实现即时通讯功能(J2EE方式)

    WebSocket是一种在单个TCP连接上进行全双工通信的协议,WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,本文给大家介绍了SpringBoot+WebSocket实现即时通讯功能(J2EE方式),需要的朋友可以参考下
    2025-01-01
  • Mybatis打印替换占位符后的完整Sql教程

    Mybatis打印替换占位符后的完整Sql教程

    这篇文章主要介绍了Mybatis打印替换占位符后的完整Sql教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 在Java8中构建Stream流的多种方式详解

    在Java8中构建Stream流的多种方式详解

    当我们处理集合数据时,往往需要对其进行各种操作,如过滤、映射、排序、归约等,在 Java 8 中引入的 Stream 流为我们提供了一种更加简洁和灵活的方式来处理数据,本文将介绍如何基于 Stream 构建流,为你展示创建和操作流的多种方法
    2023-08-08
  • Jpa Specification如何实现and和or同时使用查询

    Jpa Specification如何实现and和or同时使用查询

    这篇文章主要介绍了Jpa Specification如何实现and和or同时使用查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java最长公共子序列示例源码

    Java最长公共子序列示例源码

    这篇文章主要介绍了Java最长公共子序列的定义及示例源代码,具有一定参考价值,需要的朋友可以看下。
    2017-09-09
  • 在Mac OS上安装Tomcat服务器的教程

    在Mac OS上安装Tomcat服务器的教程

    这篇文章主要介绍了在Mac OS上安装Tomcat服务器的教程,方便进行工作环境下的Java web开发,需要的朋友可以参考下
    2015-11-11
  • Struts2 Result 参数详解

    Struts2 Result 参数详解

    这篇文章主要讲解Struts2 Result的参数,讲的比较详细,希望能给大家做一个参考。
    2016-06-06
  • HashMap工作原理_动力节点Java学院整理

    HashMap工作原理_动力节点Java学院整理

    这篇文章主要介绍了HashMap工作原理_动力节点Java学院整理,需要的朋友可以参考下
    2017-04-04

最新评论