springboot 忽略接收请求中的参数

springboot 忽略接收请求中的参数

一、场景说明

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

二、开发环境

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

三、实现思路
  1. 使用Java的注解技术,定义一个ReceiveIgnoreParam注解,作用在Controller的需要忽略接收属性的方法上。
  2. 通过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切面结合可以做很多事情。

<think>我们正在处理一个关于Spring Boot如何接收JSON数据的问题。用户询问了实现方法,我们需要根据提供的引用内容来构建答案。 引用内容涉及多个方面,包括使用@RequestBody注解接收JSON对象、使用Map或自定义对象接收、以及相关的配置和依赖。 根据引用,我们可以总结出几种常见的方法: 1. 使用@RequestBody注解配合Map接收(如引用1和引用3所示) 2. 使用@RequestBody注解配合自定义Java对象接收(引用5中提到了返回JSON,同理接收也可以用对象) 3. 使用@RequestBody注解配合JSONObject(引用1和引用3) 另外,引用4提到Spring Boot默认使用HttpMessageConverter来处理JSON转换,底层依赖于具体的JSON库(如Jackson或Gson)。 因此,我们的回答应该包括以下步骤: - 添加相关依赖(实际上Spring Boot Web starter默认包含Jackson) - 创建Controller方法,使用@RequestBody接收JSON数据 - 展示几种不同的接收方式(Map、自定义对象、JSONObject) 同,我们还需要注意: - 使用@RestController或者@Controller+@ResponseBody - 确保请求的Content-Type为application/json 我们将按照以下结构组织答案: 1. 引入依赖(简单说明,因为默认就有) 2. 使用Map接收JSON数据 3. 使用自定义Java对象接收 4. 使用JSONObject(需要引入相关库,如fastjson,但注意Spring Boot默认支持Jackson,所以不推荐额外引入,但用户可能看到过这种用法) 5. 注意事项 由于引用5中展示了返回JSON,我们可以类比接收JSON。 另外,引用2和引用4提到了Jackson的注解,如@JsonIgnore,在接收同样有效。 现在,我们开始编写回答。</think>### Spring Boot 接收 JSON 数据的实现方法 在 Spring Boot接收 JSON 数据主要通过 **`@RequestBody`** 注解实现,结合 Spring MVC 的 **HttpMessageConverter** 自动完成 JSON 到 Java 对象的转换。以下是具体实现方式: --- #### 1. **使用 `Map` 接收 JSON** ```java @RestController @RequestMapping("/api") public class JsonController { @PostMapping("/map") public Map<String, Object> handleJson(@RequestBody Map<String, Object> jsonMap) { // 直接操作 Map 中的键值对 String name = (String) jsonMap.get("name"); Integer age = (Integer) jsonMap.get("age"); // 返回处理结果 Map<String, Object> response = new HashMap<>(); response.put("status", "success"); response.put("data", jsonMap); return response; } } ``` - **说明**:适用于动态字段或未知结构的 JSON,无需预定义对象[^1][^3]。 - **请求示例**: ```json POST /api/map Content-Type: application/json {"name": "John", "age": 25} ``` --- #### 2. **使用自定义 Java 对象接收** ```java // 定义实体类 public class User { private String name; private int age; // Getter/Setter 必须存在(可用 Lombok 简化) } @RestController @RequestMapping("/api") public class JsonController { @PostMapping("/object") public User handleJson(@RequestBody User user) { // 直接操作对象属性 user.setName(user.getName().toUpperCase()); return user; } } ``` - **说明**: - 字段名需与 JSON 的 key 严格匹配(可通过 `@JsonProperty` 自定义映射)。 - 使用 `@JsonIgnore` 忽略字段,`@JsonFormat` 格式化日期[^5]。 - **依赖**:Spring Boot 默认使用 **Jackson**(无需额外配置)[^4][^5]。 --- #### 3. **使用 `JSONObject` 接收(需第三方库)** ```java @PostMapping("/jsonObject") public JSONObject handleJson(@RequestBody JSONObject jsonObject) { // 使用 fastjson 或 org.json 操作 String type = jsonObject.getString("type"); jsonObject.put("processed", true); return jsonObject; } ``` - **说明**:需引入 `fastjson` 或 `org.json` 依赖(不推荐,优先使用内置 Jackson)[^3]。 --- #### 关键配置与注意事项 1. **必须的注解**: - `@RequestBody`:标注参数,声明从请求体获取 JSON。 - `@RestController` 或 `@ResponseBody`:确保返回值转为 JSON[^2][^5]。 2. **请求头要求**: - `Content-Type: application/json`(客户端必须指定)。 3. **依赖管理**: - `spring-boot-starter-web` 默认包含 Jackson 依赖[^4][^5]。 - 若需替换为 Gson,排除 Jackson 并添加 `gson` 依赖。 4. **异常处理**: - JSON 解析失败会抛出 `HttpMessageNotReadableException`,可通过 `@ControllerAdvice` 全局捕获。 --- #### 完整工作流程 ```mermaid graph LR A[客户端请求] --> B[JSON 数据] B --> C{Spring Boot 控制器} C --> D[@RequestBody 解析] D --> E[HttpMessageConverter 转换] E --> F[Java 对象/Map] F --> G[业务逻辑处理] G --> H[JSON 响应返回] ``` > **提示**:优先推荐**自定义对象接收**,类型安全且简洁;动态场景可用 **`Map`** 方案;避免直接使用 `JSONObject` 以防止依赖冲突[^4][^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值