Feign 调用报 RequestParam.value() was empty on parameter 0

news2024/11/26 18:48:28

详细报错:  FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0

背景

最近在使用 @RequestParam、@RequestBody 注解定义 feign 接口的时候出现一些使用上的问题,造成调用方启动的时候会报错。

详细情况

  1. 第一种情况,如下:
@PostMapping(value = "/hello2")
BetaDto hello2(String name1);

接口有且只有一个 key/value 参数,此时可以不必在 name1 参数上使用 @RequestParam 注解。通过 Feign 调用该接口的调用方可以正常启动。

  1. 第二种情况,如下:
@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam String name1);

接口有且只有一个 key/value 参数,此时如果对 name1 参数上使用 @RequestParam 注解,此时通过 Feign 调用该接口的调用方可启动的时候回抛出如下错误:

Caused by: java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0

意思是 @RequestParam 的 value 值不允许为空,正确的姿势如下:

@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam("name1") String name1);
  1. 第三种情况,如下:
@PostMapping(value = "/hello2")
BetaDto hello2(String name1, String name2);

接口存在多个 key/value 参数,此时通过 Feign 调用该接口的调用方启动的时候会抛出如下错误:

Caused by: java.lang.IllegalStateException: Method has too many Body parameters

像这种多参数(key/value)的情况必须为每个参数增加 @RequestParam 注解,正确的姿势如下:

@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam(“name1”)  String name1, @RequestParam(“name2”)  String name2);

总结

  1. 在使用 @RequestParam 注解的时候,value 值必须设置,如下:
@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam(“name1”)  String name1);
  1. 如果接口有且只有一个参数,并且该参数是 key/value 类型,则无需为该参数设置 @RequestParam 注解,如下:
@PostMapping(value = "/hello2")
BetaDto hello2(String name1);
  1. 接口存在多个参数(key/value、Json 对象)的时候,每个 key/value 类型的参数必须显示的指定 @RequestParam 注解,且必须设置对应的 value
@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam(“name1”) String name1, RequestParam(“name2”) String name2, BetaDto betaDto);
  1. 接口无论有多个参数还是一个参数,都不需要为 Json 对象参数显示的指定 @RequestBody 注解
@PostMapping(value = "/hello1")
BetaDto hello1(BetaDto betaDto);

@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam(“name1”) String name1, RequestParam(“name2”) String name2, BetaDto betaDto);
  1. 每个接口里只允许有一个 JSON 对象类型的参数,否则通过 Feign 调用该接口的调用方启动的时候会抛出如下错误:
Caused by: java.lang.IllegalStateException: Method has too many Body parameters
上面摘自:  Feign 中使用 @RequestParam、@RequestBody 的正确姿势_IT技术分享网

 个人总结: 

开发还是按规范来,post 请求就用对象来接收,就不会有这种问题~~

package com.riskeys.anyi.manage.remote.channel;


import com.riskeys.anyi.manage.model.dto.product.ProductViewDto;
import com.riskeys.anyi.manage.model.dto.product.ProductViewEditDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @Title: 商品信息远程调用路由配置
 * @Author: ken
 * @Description:
 * @Date: 2023/7/5  13:17
 * @Param:
 * @return
 **/
@FeignClient(name = "biz-channel-2b2a", contextId = "product", path = "/channel/tbta/product")
public interface ProductViewRemoteService {

    /**
     * @return com.riskeys.common.base.model.Result
     * @Title: 保存产品展示信息
     * @Author: ken
     * @Description:
     * @Date: 2023/6/26  15:35
     * @Param: [productViewDto]
     **/
    @PostMapping(value = "/saveProductView")
    void saveProductView(@RequestBody ProductViewDto productViewDto);

    /**
     * @return com.riskeys.common.base.model.Result
     * @Title: 下架产品展示信息
     * @Author: ken
     * @Description:
     * @Date: 2023/6/26  15:35
     * @Param: [productId]
     **/
    @PostMapping(value = "/editProductView")
    void editProductView(@RequestBody ProductViewEditDto productViewEditDto);

    /**
     * @return com.riskeys.anyi.manage.model.dto.product.ProductViewDto
     * @Title: 查询产品展示信息
     * @Author: ken
     * @Description:
     * @Date: 2023/7/5  13:17
     * @Param: [productId]
     **/
    @GetMapping(value = "/queryProductView")
    ProductViewDto queryProductView(@RequestParam("productId") String productId);
}
/**
 * @Title: 下架产品扩展信息DTO
 * @Author: ken
 * @Description:
 * @Date: 2030/6/13  16:56
 **/
@Data
@ApiModel(description = "下架产品扩展信息DTO")
public class ProductViewEditDto implements Serializable {

    private static final long serialVersionUID = -5370338334580177847L;

    /**
     * 产品ID
     */
    private String productId;
}

 公众号请关注"果酱桑", 一起学习,一起进步!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ceph:关于Ceph 集群中数据分布和容灾理论的一些笔记

写在前面 准备考试,整理 Ceph 相关笔记博文内容涉及,Ceph 集群中数据如何分布以及不同的容灾池介绍理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有…

【MySQL系列】数据库基础学习_简单认识数据库

「前言」文章内容大致是数据库基础,以及数据库的基本知识。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 我见青山多妩媚,料青山、见我应如是。 ——辛弃疾《贺新郎》 目录 一、连接MySQL服务器二…

hcip第三次作业

1、合理规划IP地址,启用OSPF单区域。 2、R1-R2之间启用PPP的PAP单向认证。 把R1作为主认证方 然后在R2处做添加——帐号、密码 接口处于双UP的状态,证明认证成功 3、R2-R3之间启用PPP的chap双向认证 R2作为主认证方。 此时4/0/1口处于up - down状态 然…

Zabbix6.0 的部署、自定义监控服务

目录 一、概述 二、 zabbix 1.zabbix简介 2.zabbix监控原理 3. Zabbix 6.0 新特性 3.1Zabbix server高可用防止硬件故障或计划维护期的停机 3.2 Zabbix 6.0 LTS新增Kubernetes监控功能,可以在Kubernetes系统从多个维度采集指标 4. Zabbix 6.0 功能组件 4.1…

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/

-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPathD:/在内存溢出时导出整个堆信息 指定导出堆的存放路径(D:/java_customName.hprof),可以自定义dump名字;自定义名字时重复执行dump文件貌似不会覆盖(D:/),只指定路径会自动生成Dump文件&…

10G CWDM和DWDM的优势和应用场景解析

10G CWDM和10G DWDM光模块都是用于光纤通信系统的传输技术,它们在光纤网络中使用不同的光波分复用技术。本期文章我们通过分析10G CWDM SFP和10G DWDM SFP两种光模块进行区别对比。 一、10G CWDM和DWDM光模块参数区别对比 二、易天光通信10G CWDM和DWDM光模块优势对…

品牌从0到1,中小企业如何在市场中脱颖而出?

道叔在初创小企业做过品牌,所以对这一块很清楚。在资金有限的中小企业做品牌,并不需要在品牌建设上砸钱,没钱也不是不可以做品牌,不花钱有不花钱的做法。 以下是个人在小企业做品牌的一些实际操作经验,都是干得不能再…

【UnitDOTS 小知识】ChunkComponet存储

ChunkComponet存储 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、ChunkComponet的特点 按ChunkComponent按Chunck存储的,他…

C4D和3dmax在不同应用场景下对比,哪个更好用

Maxon Cinema 4D 和Autodesk 3ds Max 是艺术家和工作室在许多领域经常使用的两种最著名的 3D 软件。它们都有不同的功能,在本文中,让我们对它们进行比较。我们将尽力向您概述它们之间的主要区别以及两者的能力。 哪一个更容易使用/学习? Ci…

Java 基础入门篇(四):方法的重载与参数传递机制

文章目录 一、方法的定义二、方法的参数传递机制 ★2.1 基本类型的参数传递2.2 引用类型的参数传递三、方法重载 一、方法的定义 方法的作用:封装一段代码的语法结构,可以被重复调用,以此提高代码的复用性,提高开发效率&#xff0…

无线传感器:智能家居监控系统设计

创造声明:本文档由北溪入江流与砂砾共同协作完成 一:选题理由 1.1 市场分析 随着经济的发展,人们的生活水平提高,人们对家庭居住的环境,安全性和智能性需求越来越高,越来越多的人开始关注智能家居系统。智…

FANUC机器人MEMO-126故障报警,无更多可用TPP内存的处理方法

FANUC机器人MEMO-126故障报警,无更多可用TPP内存的处理方法 如下图所示,示教器上报警提示“MEMO-126 无更多可用TPP内存”, 检查系统TPP存储空间是否够用,如下图所示,依次找到MENU—状态—存储器, 如下…

SSM项目前后端分离+IDEA运行环境(含前端源码)(个人博客系统)

目录 后端项目环境配置 1、创建一个SpringBoot项目,添加MyBatis框架和数据库MySQL驱动依赖 2、配置项目文件:application.yml 3、创建数据库表 4、创建分层结构目录 返回统一数据格式 创建统一数据格式返回类:AjaxResult 创建实现统一…

两款免费好用的OPCUA服务端模拟器

一、OPC UA服务器1 1、下载 https://download.csdn.net/download/qq_43445867/87967458 2、安装完打开即可开启opc服务 另外此软件还可以模拟一些变量变化 二、OPC UA服务器2 1、测试opc服务器 启动Softing OPC Client输入连接信息后可以看到已经连接到OPC服务器 Softing …

企业内容管理升级 3.0:构建生态协同,助力合规成长

企业内容管理曾一度火热,但其早期方案似乎已过时。实际上,随着企业数字化转型的加深,企业内容管理也在不断演进,陪伴着企业数字化成长。 企业内容管理3.0 企业内容管理1.0实现企业无纸化,提高业务运营效率。以电子影像技术为主,使纸质文件电…

手撕spring03源码

概述 传入对象参数通过cglib实例化代理对象整体设计 知识补充 /**** param beanDefinition* param beanName* param ctor 构造方法* param args 参数* return* throws BeansException*/Overridepublic Object instantiate(BeanDefinition beanDefinition, String beanName, C…

安达发|APS车间排产软件生产计划优化利器

APS车间排产软件是一款专门针对制造企业的生产计划排程优化软件。它可以帮助企业实现优化排程和提高生产效率。具体来说,它能够解决企业面临的多种复杂问题,包括: 1. 优化排产计划,避免设备闲置和资源浪费。通过对订单和产能的预…

Python:简单处理表格和图片数据并初步分析

目录 1.需求: 2.表格示例: 3.安装第三方库 4.代码实现 : 1.需求: 8.对周五面试结果excel表格进行操作 20分输出所有同学“名称:对应成绩”的信息 2分输出分值最高和最低的同学名称及分数,(…

Spring Boot 中的静态资源是什么,如何使用

Spring Boot 中的静态资源是什么,如何使用 在 Web 应用程序中,静态资源通常是指不会动态生成的文件,例如图片、CSS、JavaScript 文件等。Spring Boot 提供了一种简单的方式来处理这些静态资源,让我们可以更加方便地管理和使用它们…