基于Springboot用axiospost请求接收字符串参数为null的解决方案

问题

今天在用前端 post 请求后端时发现,由于是以 Json对象的形式传输的,后端用两个字符串形参无法获取到对应的参数值

前端代码如下:

axios.post('http://localhost:8083/test/postParams',{a: '1', b:'2'} ,{
        'Content-Type': 'application/json'
    }).then(response => {
      console.log(response.data);
    })
    .catch(error => {
      console.error('There was an error!', error);
});

后端代码如下:

@RequestMapping("/test")
@RestController
@Slf4j
public class TestController {
    @PostMapping("/postParams")
    public void postParams(String a, String b) {
        log.info(String.valueOf(a));
        log.info(b);
    }
}

image-20250123171531186

解决

在网上学习了一下,究其原因是Spring Boot 无法直接将 JSON 字符串转换为一个 String 变量, Spring Boot 需要通过相应的机制,将 JSON 字符串解析成可用的 Java 对象或 Map,在学习了某位前辈的文章后,通过自定义注解的方式解决了问题:

​ 总的思路就是,getRequestBody()将请求的json对象字符串先缓存到cache中,然后将该字符串解析成Json对象,在根据对应的方法形参的名字,将值注入进去。

自定义注解类

/**
 * @author yamu
 * @version 1.0
 * @description: 接收前端传的 包装类数据 或 String 自定义注解
 * @date 2025/1/13 11:05
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestJson {
    //参数值(对应的键名)
    String value() default "";
}

定义@RequestJson的方法形参解析器

/**
 * @author yamu
 * @version 1.0
 * @description: 自定义注解 RequestJson 方法形参解析器
 * @date 2025/1/13 11:07
 */
@Component
@Slf4j
public class RequestJsonMethodArgumentResolver implements HandlerMethodArgumentResolver {
    public static String cache = "";//缓存请求体
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(RequestJson.class);
    }
    /**
     * @description  String 参数注入
     * @param: parameter
     * @param: mavContainer
     * @param: webRequest
     * @param: binderFactory
     * @returns Object
     * @author yamu
     * @date 2025/1/20 14:33
     */
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        RequestJson requestJson = parameter.getParameterAnnotation(RequestJson.class);
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        //未指定映射的键时,默认值为形参名
        String value = requestJson.value();
        if (value.isEmpty()) {
            value = parameter.getParameterName();
        }
        JSONObject jsonObject = getRequestBody(request);
        //遍历完最后一个参数,则清理缓存
        if (parameter.getMethod().getParameterCount() - 1 <= parameter.getParameterIndex()) {
            cache = "";
        }
        //请求的参数为空,直接返回null
        if (jsonObject == null) {
            return null;
        }
        return jsonObject.get(value);
    }

    /**
     * 获取参数列表
     * @param request
     * @return
     */
    private JSONObject getRequestBody(HttpServletRequest request) {
        //cache不为空
        if (!cache.isEmpty()) {
            return JSONObject.parseObject(cache);
        }
        //字符串拼接成Json字符串
        StringBuilder sb = new StringBuilder();
        try {
            BufferedReader reader = request.getReader();
            char[] buf = new char[1024];
            int rd;
            while ((rd = reader.read(buf)) != -1) {
                sb.append(buf, 0, rd);
            }
        } catch (IOException ex) {
            log.error(ex.getMessage());
        }
        cache = sb.toString();
        return JSONObject.parseObject(sb.toString());
    }
}

在WebConfig里注册解析器

@Configuration
@Slf4j
public class WebConfig extends WebMvcConfigurationSupport  {

    @Autowired
    private RequestJsonMethodArgumentResolver requestJsonMethodArgumentResolver;

    /**
     * @description 配置方法解析器
     * @param: argumentResolvers
     * @returns void
     * @author yamu
     * @date 2025/1/23 16:00
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(requestJsonMethodArgumentResolver);
    }
}

在方法形参上加上注解

@RequestMapping("/test")
@RestController
@Slf4j
public class TestController {
    @PostMapping("/postParams")
    public void postParams(@RequestJson String a, @RequestJson String b) {
        log.info(a);
        log.info(b);
    }
}

image-20250123174734261

上述方式存在几个问题:

  1. 由于要缓存请求的 Json字符串,所以在每次请求完之后要清除cache,上述方法是在方法形参的最后一个并且加了@RequestJson注解的参数才可以清理
  2. 由于需要对每个参数进行赋值,所以需要对每个要注入的参数都要加上@RequestJson注解
  3. 处理包装类或字符串类时,形参类型需要强一致(不能用Stringl类型接收一个Integer的参数值),同时也无法处理复杂的对象类型

后续在逐渐的深入学习后我会优化上述方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958784.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——堆(介绍,堆的基本操作、堆排序)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

【Qt】05-菜单栏

做菜单 前言一、创建文件二、菜单栏 QMenuBar2.1 示例代码2.2 运行结果 三、工具栏 QToolBar3.1 运行代码3.2 结果分析 四、状态栏 QStatusBar4.1 运行代码4.2 运行结果 五、文本编辑框 QTextEdit5.1 运行代码5.2 运行结果 六、浮动窗口 addDockWidget6.1 运行代码6.2 运行结果…

【喜讯】海云安荣获“数字安全产业贡献奖”

近日&#xff0c;国内领先的数字化领域独立第三方调研咨询机构数世咨询主办的“2025数字安全市场年度大会”在北京成功举办。在此次大会上&#xff0c;海云安的高敏捷信创白盒产品凭借其在AI大模型技术方面的卓越贡献和突出的技术创新能力&#xff0c;荣获了“数字安全产业贡献…

MySQL训练营-慢查询诊断问题

slow_query_log long_query_time slow_query_log&#xff1a;日志开关&#xff0c;是否记慢查询日志 long_query_time&#xff1a;超过多长时间判定为慢查询 查看参数设置&#xff1a; SHOW VARIABLES LIKE ‘slow_query_log’;SHOW VARIABLES LIKE ‘long_query_time’; …

2025年最新汽车零部件企业销售项目管理解决方案

在汽车零部件企业&#xff0c;销售项目管理的不规范和销售预测的不准确性常导致生产计划无法及时调整&#xff0c;因此客户关系常常中断&#xff0c;导致企业业务机会的丧失。为解决该问题&#xff0c;企业需要投入更多资源以优化销售流程与销售预测。 1、360多维立体客户视图…

K8S中ingress详解

Ingress介绍 Kubernetes 集群中&#xff0c;服务&#xff08;Service&#xff09;是一种抽象&#xff0c;它定义了一种访问 Pod 的方式&#xff0c;无论这些 Pod 如何变化&#xff0c;服务都保持不变。服务可以被映射到一个静态的 IP 地址&#xff08;ClusterIP&#xff09;、一…

大模型:LangChain技术讲解

一、什么是LangChain 1、介绍 LangChain是一个用于开发由大型语言模型提供支持的Python框架。它提供了一系列工具和组件&#xff0c;帮助我们将语言模型集成到自己的应用程序中。 有了它之后&#xff0c;我们可以更轻松地实现对话系统、文本生成、文本分类、问答系统等功能。…

【优选算法篇】2----复写零

---------------------------------------begin--------------------------------------- 这道算法题相对于移动零&#xff0c;就上了一点点强度咯&#xff0c;不过还是很容易理解的啦~ 题目解析&#xff1a; 这道题如果没理解好题目&#xff0c;是很难的&#xff0c;但理解题…

office 2019 关闭word窗口后卡死未响应

最近关闭word文件总是出现卡死未响应的状态&#xff0c;必须从任务管理器才能杀掉word 进程&#xff0c;然后重新打开word再保存&#xff0c;很是麻烦。&#xff08;#其他特征&#xff0c;在word中打字会特别变慢&#xff0c;敲击键盘半秒才出现字符。&#xff09; office官网…

acm培训 part 1(学习总结)

第一部分的重点为语法糖&#xff0c;时空复杂度&#xff0c;stl容器等等&#xff0c;下面就简单介绍一下这些部分。 1. 语法糖 1.1 定义 语法糖是由英国计算机科学家彼得约翰兰达提出的一个术语&#xff0c;指的是编程语言中添加的某种语法&#xff0c;这种语法对语言的功能…

Arduino基础入门学习——OLED显示屏+DHT11采集温湿度并显示

Arduino基础入门学习——OLED显示屏DHT11显示温湿度 一、前言二、准备工作三、程序代码四、结束语 一、前言 本篇文章主要使用OLED液晶显示屏模块和DHT11温湿度传感器&#xff0c;获取环境温湿度并显示在显示屏&#xff0c;也算是结合之前我所编写的博客给大家带来一个算是比较…

Kubernetes相关知识入门详解

一、Pod的滚动升级 1.服务升级的一般思路&#xff1a;停止与该服务相关的所有服务pod&#xff0c;重新拉去更新后的镜像并启动。这种方法存在一个比较现实的问题是逐步升级导致较长时间的服务不可用。 2.Kubernetes滚动升级的思路&#xff1a;通过滚动升级的命令创建新的rc&…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

Qt 5.14.2 学习记录 —— 십구 事件

文章目录 1、事件的概念2、处理事件3、鼠标事件1、鼠标单击和双击2、鼠标移动3、鼠标滚轮滚动 4、键盘事件5、定时器事件6、窗口移动和大小改变事件 1、事件的概念 用户进行操作时会产生事件&#xff0c;事件可以关联处理函数。Qt封装了操作系统的事件机制&#xff0c;然后进一…

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析 文章目录 10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析1. 规则持久化1.1 Nacos Server 配置中心-规则持久化实例 2. 最后&#xff1a; 1. 规则持久化 规则没有持久化的问题 如果 sentinel 流控规则没有…

地学专业想提前准备春招?怎么准备自己的简历?

眼看着即将过年&#xff0c;过完年后基本上春招也要开始提上日程 之前咱们说过&#xff0c;很多同学认为自身技术过硬就会一路顺风&#xff0c;自己经验丰富、编程技术过硬&#xff0c;就不愁找不到工作&#xff0c;这固然是取得好offer的基础。 但再好的技术也不可能通过混乱…

IoTDB结合Mybatis使用示例(增删查改自定义sql等)

IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库&#xff0c;针对IoTDB的内容不做过多介绍&#xff0c;在使用该时序库时&#xff0c;往往有一定入门门槛&#xff0c;不同于关系型数据库或文档型数据库那般方便维护和接入开发&#xff0c;…

Go语言的栈空间管理

Go 语言的栈空间管理 Go 语言的栈空间管理是其并发模型的核心之一。Go 的运行时环境&#xff08;runtime&#xff09;采用动态栈分配机制&#xff0c;能够根据 Goroutine 的需求动态扩展和收缩栈空间&#xff0c;避免了传统固定栈大小的限制。Go 的栈管理经历了从 分块式栈 到…

细说STM32F407单片机电源低功耗StandbyMode待机模式及应用示例

目录 一、待机模式基础知识 1、进入待机模式 2、待机模式的状态 3、退出待机模式 二、待机模式应用示例 1、示例功能和CubeMX项目设置 &#xff08;1&#xff09; 时钟 &#xff08;2&#xff09; DEBUG、LED1、KeyRight、USART6、CodeGenerator &#xff08;3&#x…

我谈《概率论与数理统计》的知识体系

学习《概率论与数理统计》二十多年后&#xff0c;在廖老师的指导下&#xff0c;才厘清了各章之间的关系。首先&#xff0c;这是两个学科综合的一门课程&#xff0c;这一门课程中还有术语冲突的问题。这一门课程一条线两个分支&#xff0c;脉络很清晰。 概率论与统计学 概率论…