springboot如何忽略接收请求中的参数

 更新时间:2024年07月16日 09:58:08   作者:Rewloc  
这篇文章主要介绍了springboot如何忽略接收请求中的参数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、场景说明

在一些开发场景中,特别是前后端分开开发的场景中,由于后端接口采用的VO接收前端请求传递的参数,但是前端开发小伙伴可能会把vo中所有属性不进行过滤就直接调用接口,这样会导致后端api由于不需要某些字段而导致api运行失败,比如:id字段等。

二、开发环境

  • 开发工具:IDEA
  • 开发语言:JAVA 1.8
  • 开发环境:Springboot 2.4.13

三、实现思路

  • 使用Java的注解技术,定义一个ReceiveIgnoreParam注解,作用在Controller的需要忽略接收属性的方法上。
  • 通过spring切面编程技术来实现对方法注解的操作,其判断方法参数中是否包含需要忽略的属性,如果存在直接设置为null或者空串

四、具体实现

  • 注解类代码
package com.rewloc.annotation;

import java.lang.annotation.*;

/**
 * 类描述:忽略接收参数 注解
 *
 * @date 2022/5/9 10:54
 * @slogan 设计就是代码,代码就是设计
 * @since JDK 8
 */
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.METHOD)
public @interface ReceiveIgnoreParam {
    /** 字段名数组 */
    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;

/**
 * 类描述:忽略接收参数 切面类
 *
 * @slogan 设计就是代码,代码就是设计
 * @since JDK 8
 */
@Aspect
@Component
public class ReceiveIgnoreParamAop {
    private static final String ID = "id";

    /**
     * 方法描述: 切面拦截器
     *
     * @slogan 设计就是代码,代码就是设计
     */
    @Pointcut("@annotation(com.rewloc.ReceiveIgnoreParam)")
    private void ignoreReceiveParam() {
    }

    /**
     * 方法描述: 忽略属性值拦截处理
     *
     * @param point 环绕通知处理对象
     * @return {@link Object}
     * @slogan 设计就是代码,代码就是设计
     */
    @Around(value = "ignoreReceiveParam()")
    public Object doAround(ProceedingJoinPoint point) {
        try {
            // 获取注解信息
            MethodSignature methodSignature = (MethodSignature) point.getSignature();
            ReceiveIgnoreParam ignoreReceiveParam = methodSignature.getMethod().getAnnotation(ReceiveIgnoreParam.class);
            // 获取方法的参数
            Object[] args = point.getArgs();
            // 循环返回参数,
            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("系统繁忙,请稍后再试!");
        }
    }

    /**
     * 方法描述: 情况属性的值
     *
     * @param obj       参数对象
     * @param fieldName 字段名称
     * @return {@link Object}
     * @slogan 设计就是代码,代码就是设计
     */
    private void cleanValue(Object obj, String fieldName) throws IllegalAccessException {
        // 获取参数对象
        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;

/**
 * 类描述:忽略接收参数 controller类
 *
 * @slogan 设计就是代码,代码就是设计
 * @since JDK 8
 */
@RestController
@RequestMapping("/receive/ignoreParam")
public class ReceiveIgnoreParamController {
    /**
     * 分页获取查询列表
     *
     * @param vo    接收查询参数的VO对象
     * @return Result
     */
    @PostMapping("/hello")
    @ReceiveIgnoreParam(fieldName = {"id", "name"})
    public String selectPage(ReceiveIgnoreParamVO vo) {
        // 将当前vo对象返回
        return JSONObject.toJSONString(vo);
    }
}

五、总结

只要注解和spring切面结合可以做很多事情。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot启动时调用自己的非web逻辑

    Spring Boot启动时调用自己的非web逻辑

    在spring Boot中,有些代码是WEB功能,例如API等,但是有些逻辑是非WEB,启动时就要调用并持续运行的,该如何加载自己的非WEB逻辑呢,下面通过实例代码给大家讲解,一起看看吧
    2017-07-07
  • Java中逆序遍历List集合的实现

    Java中逆序遍历List集合的实现

    本文主要介绍了Java中逆序遍历List集合的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 谷歌二维码引擎com.google.zxing二维码生成与解析

    谷歌二维码引擎com.google.zxing二维码生成与解析

    这篇文章主要给大家介绍了关于谷歌二维码引擎com.google.zxing二维码生成与解析的相关资料,zxing是google开源的二维码生成和解析工具,需要的朋友可以参考下
    2023-07-07
  • 使用Gson将字符串转换成JsonObject和JsonArray

    使用Gson将字符串转换成JsonObject和JsonArray

    这篇文章主要介绍了使用Gson将字符串转换成JsonObject和JsonArray,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot整合Sa-Token实现 API 接口签名安全校验功能

    SpringBoot整合Sa-Token实现 API 接口签名安全校验功能

    这篇文章主要介绍了SpringBoot整合Sa-Token实现 API 接口签名安全校验功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • SpringBoot使用Prometheus采集自定义指标数据的方法详解

    SpringBoot使用Prometheus采集自定义指标数据的方法详解

    随着微服务在生产环境大规模部署和应用,随之而来也带来了新的问题,其中比较关键的就是关于微服务的运维和监控,本文将结合微服务运维监控中的指标监控进行详细的说明,需要的朋友可以参考下
    2024-07-07
  • JavaScript 与 Java 区别介绍  学java怎么样

    JavaScript 与 Java 区别介绍 学java怎么样

    JavaScript 是一种嵌入式脚本文件,直接插入网页,有浏览器一边解释一边执行。而java 语言不一样,他必须在JAVA虚拟机上运行。而且事先需要进行编译。接下来脚本之家小编给大家揭晓js与java区别,感兴趣的朋友一起看看吧
    2016-09-09
  • jstack+jdb命令查看线程及死锁堆栈信息的实例

    jstack+jdb命令查看线程及死锁堆栈信息的实例

    这篇文章主要介绍了jstack+jdb命令查看线程及死锁堆栈信息的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 基于java高并发处理方案

    基于java高并发处理方案

    这篇文章主要介绍了基于java高并发处理方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • SpringBoot + SpringSecurity 短信验证码登录功能实现

    SpringBoot + SpringSecurity 短信验证码登录功能实现

    这篇文章主要介绍了SpringBoot + SpringSecurity 短信验证码登录功能实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06

最新评论