FeignClient调用服务及上传文件的注意点及问题

目录

  • 代码示例
    • 文件服务接口
    • 调用方
  • 注意点:
  • 2021.3.16更新:发新的坑
    • 坑点:
    • 原因分析
  • 部分异常及解决方案
    • 异常一:[Method has too many Body parameters](https://blog.csdn.net/haishiyizhenfeng/article/details/80607003)
    • 异常二:[@FeignClient注入找不到的异常](https://blog.csdn.net/qq_28165595/article/details/102328066)
    • 异常三:[feign.FeignException$MethodNotAllowed: status 405](https://blog.csdn.net/qq_43371556/article/details/100548389)
  • 其他问题

代码示例

  • 文件服务接口

	/*** 用于上传文传* UploadFile包含fileName、fileDesc* 不加@RequestParam等同于@RequestParam(required = false)* * @param file 文件* @param entity 文件的描述* @return*/@PostMapping("/add")public Response<Object> add(@RequestPart(value = "file") MultipartFile file,UploadFile entity,) {Response<Object> res = new Response<>();FileHandlerResult handlerResult = service.saveFile(file);return res;}
  • 调用方

@FeignClient(value = "file-server")
public interface FileService {@PostMapping(value = "/static/add", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)Response<LinkedHashMap<Object, Object>> saveFile(@RequestPart(value = "file") MultipartFile file,@RequestParam(value = "fileName")String fileName,@RequestParam(value = "fileDesc")String fileDesc);
}

注意点:

  1. 参数是文件类型的要用@RequestPart注解
  2. 调用方需要设置ContentType为multipart/form-data
@PostMapping(value = "xxx", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  1. 调用方的文件参数名必须与服务接口的文件参数名相同,示例中文件参数都为@RequestPart(value = "file") MultipartFile file,参数名不同会导致服务接口接收到的文件为NULL。

2021.3.16更新:发新的坑

坑点:

调用方在接受MultipartFile参数,并传给服务方时必须保持MultipartFile参数的参数名与服务方一致(即multipartFile.getName()必须与服务方的@RequestPart(value = "xxx") MultipartFile file的value值相同),否则服务方会找不到参数!!!

最近在补充原本的分布式项目时,发现在调用发Controller层接受文件参数后,使用OpenFeign调用文件上传服务,一直报错(没有接受到参数file):

Required request part 'file' is not present

报错时调用方Controller代码:

	/*** @RequestParam(name)MultipartFile[] file* 中的name, 即参数名必须与调用方接口的参数名相同* 否则服务方会报错Required request part 'file' is not present*/@PostMapping("/upload")public Response<Object> upload(@RequestParam("image")MultipartFile image){Response<Object> res = new Response<>();List<Object> data = new LinkedList<>();//调用服务方的接口Response<LinkedHashMap<Object, Object>> response = fileService.saveFile(image);if(response.getCode()==400){//保存失败res.fail(response.getDesc());return res;}data.add(response);res.success(data);return res;}

服务方代码:

	@PostMapping("/add")public Response<Object> add(@RequestPart(value = "file") MultipartFile file,UploadFile entity,) {Response<Object> res = new Response<>();FileHandlerResult handlerResult = service.saveFile(file);return res;}

此时服务方接受不到调用方传的文件参数。

原因分析

在调用方的Controller中参数为@RequestParam("image")MultipartFile image
输出image的文件名,可以发现输出为:image@RequestParam("image")的参数名一致

//输出结果image
System.out.println(image.getName());

而服务方接口需要的文件名 @RequestPart(value = "file") MultipartFile file,即参数名字需要为file,而openfeign传给服务方的文件参数名为image,因此参数传递失败。

由此可知调用方在接受MultipartFile参数,并传给服务方时必须保持MultipartFile参数的参数名与服务方一致,否则会找不到参数!!!

部分异常及解决方案

异常一:Method has too many Body parameters

@GetMapping(value="/test")  
Model test(String arg1,  String arg1); 

异常原因:

  • 当使用Feign时,如果发送的是get请求,那么需要在请求的所有参数前加上@RequestParam注解修饰
  • @RequestParam是用来修饰参数,不能用来修饰整个对象。

注意:使用@RequestParam修饰参数,请求默认的Content-Type 为 application/x-www-form-urlencoded

@RequestBody用来修饰对象

  • Feign中可以有多个@RequestParam,但只能有不超过一个@RequestBody
  • 既有@RequestBody也有@RequestParam,那么参数就要放在请求的url中,@RequestBody修饰的就要放在提交对象中。

示例:

public int save(@RequestBody Person p, @RequestParam("userId") String userId);

注意:使用@RequestBody修饰参数,请求的默认Content-Type 为 application/json 或 application/xml

异常二:@FeignClient注入找不到的异常

异常原因:
可能为启动类没有标注@EnableFeignClients

Springcloud中的服务间调用是通过Feign进行调用的,在调用方服务中,我们需要定义一些带有@FeignClient注解的接口类。并且在启动类上加上@EnableFeignClients注解。程序启动的时候,会检查是否有@EnableFeignClients注解,如果有该注解,则开启包扫描,扫描带有@FeignClient注解的接口。

异常三:feign.FeignException$MethodNotAllowed: status 405

异常原因:
调用方的方法参数没有标注@RequestParam或参数名与服务接口的参数名不相同

其他问题

  • 若是服务接口接受到的文件一直为NULL,请检测调用方法的文件参数名是否与服务接口文件参数名
  • Feign部分版本好像不支持传文件的同时传文件的参数(Hoxton.SR1没有这个问题)

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

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

相关文章

redis主从复制部署策略+jedis设置主从

【README】 redis 有3种集群模式&#xff0c;包括 主从&#xff0c; 哨兵&#xff0c; cluster&#xff1b; 本文主要po出 主从&#xff1b; master 192.168.163.201 6382 slave 192.168.163.202:6382 【1】从机 202:6382 的 redis.conf 配置 只需要编写 slaveof 192.…

python绘图时的分解问题的步骤-零基础学python-15.2 分解函数

这一章节我们来说说函数的一些主要概念 我们以一小段代码为例&#xff1a; >>> def test(): pass >>> 1. def是可执行的代码 >>> test() >>> 我们调用test方法&#xff0c;尽管什么都没有&#xff0c;但是test已经执行了 2.def创建了一个对…

千万条数据,Stack Overflow是如何实现快速分页的

转载自 千万条数据&#xff0c;Stack Overflow是如何实现快速分页的 Stack Overflow 在分页机制中使用页码代替偏移量&#xff0c;页码指向基于 LIMIT 和 OFFSET 的查询。假设要对 1000 万条记录进行分页&#xff0c;跳到最后一页会非常慢&#xff0c;但 Stack Overflow 还是想…

ubuntu系统下安装docker并部署Springboot+mysql+redis

目录安装DockerDocker常用命令构建mysql容器构建Redis容器构建Springboot应用镜像及容器&#xff08;1&#xff09;springboot使用maven将程序打成jar包&#xff0c;接着编写Dokerfile文件&#xff0c;[Dockerfile详细介绍](http://www.dockerinfo.net/dockerfile%e4%bb%8b%e7%…

redis连接池

【README】 本文旨在po出 redis连接池的测试用例 <dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.5.1</version></dependency></dependencies> 【1】 代…

qmc0转换mp3工具_GoldenRecords for Mac(唱片录音转换软件)

想要将你最喜欢的唱片音乐转换成为方便易于携带的数字音频么&#xff1f;GoldenRecords Mac版是一款Macos上的唱片录音转换软件&#xff0c;用户可以将自己收藏的旧唱片快速转换成为自己喜欢的数字音频音乐&#xff0c;随时随地想听就听&#xff01;GoldenRecords mac版&#x…

java提高篇之抽象类与接口

转载自 java提高篇之抽象类与接口 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。 抽象类与接口是java语言中对抽象概念进行定义的两种机制&#xff0c;正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间对抽象概念的支持有很大的相似&…

Java中synchronized同步块的执行流程

必要知识 Java 对象的数据结构 在 HotSpot 虚拟机中&#xff0c;Java 对象在内存中存储的布局可以分为 3 块区域&#xff1a;对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Data&#xff09;和对齐填充&#xff08;Padding&#xff09;对象头中的 Mar…

深入理解Java的接口和抽象类

转载自 深入理解Java的接口和抽象类 对于面向对象编程来说&#xff0c;抽象是它的一大特征之一。在Java中&#xff0c;可以通过两种形式来体现OOP的抽象&#xff1a;接口和抽象类。这两者有太多相似的地方&#xff0c;又有太多不同的地方。很多人在初学的时候会以为它们可以随意…

转: 记录centos7 安装erlang22.3和rabbitMQ

转&#xff1a; https://blog.csdn.net/weixin_44436611/article/details/109492936 记录centos7 安装erlang22.3和rabbitMQ 记录centos7 安装erlang22.3和rabbitMQTOC 官网地址&#xff1a;https://www.rabbitmq.com/install-rpm.html#install-erlang 部分rpm包&#xff1a;…

hashmap应用场景_工作中常用到的Java集合有哪些?应用场景是什么?

秋招Java面试大纲&#xff1a;Java并发spring数据库RedisJVMNetty等疫情期间“闭关修炼”&#xff0c;吃透这本Java核心知识&#xff0c;跳槽面试不心慌Spring全家桶笔记&#xff1a;SpringSpring BootSpring CloudSpring MVC前言Java集合是我认为在Java基础中最最重要的知识点…

Zookeeper入门总结

什么是Zookeeper 官方定义&#xff1a; zookeeper是一个分布式服务框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;统一命名服务、状态同步服务、集群管理、分布式应用配置项的管…

rabbitmq启动失败-报Failed to load advanced configuration file解决方法

【README】 1、本文基于 centos8 搭建 rabbitmq&#xff1b; 版本信息如下&#xff1a; rabbitmq rabbitmq-server-3.8.12-1.el8.noarch.rpm erlang erlang 23.2.5 (erts-11.1.8) 上述两者版本一定要强对应&#xff0c;否则mq启动失败&#xff0c;参见官网 https://rabb…

Java抽象类与接口的区别

转载自 Java抽象类与接口的区别 抽象类 抽象类是用来捕捉子类的通用特性的 。它不能被实例化&#xff0c;只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。以JDK中的GenericServlet为例&#xff1a; public abstract class GenericServlet implements Servlet…

gateway坑点:gateway有Controller时会直接处理对应的路径并返回

前言 使用gateway过程中&#xff0c;因为在gateway中加入了一个标注RestController的类&#xff0c;导致请求直接由gateway中的RestController的类处理并返回。花费了几小时才发现问题原因&#xff0c;特此记录 问题 以gateway作为网关转发请求得到的响应&#xff0c;所有字…

电脑任务栏跑到右边去了_电脑没有声音怎么解决 电脑没有声音解决方法【详解】...

电脑没有声音怎么办? 这个话题在我耳边已经听到过了无数次了&#xff0c;处理故障也是由以前的摸索解决到现在可以快速的找到原因。但对于新手朋友来说可能不知道从哪里入手&#xff0c;对于电脑没有声音怎么办&#xff0c;也给不出一个对策&#xff0c;今天围绕这个问题&…

rabbitmq-java生产者消费者

【README】 本文使用java 连接rabbitmq&#xff0c;模拟生产者&#xff0c;消费者场景 【1】项目搭建 1&#xff09;maven项目&#xff0c;依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

Java 8新特性——default方法(defender方法)介绍

转载自 Java 8新特性——default方法&#xff08;defender方法&#xff09;介绍 我们都知道在Java语言的接口中只能定义方法名&#xff0c;而不能包含方法的具体实现代码。接口中定义的方法必须在接口的非抽象子类中实现。下面就是关于接口的一个例子&#xff1a; 1 2 3 4 5 6 …

对于高并发的理解及实践方案

目录01 如何理解高并发&#xff1f;02 高并发系统设计的目标是什么&#xff1f;2.1标题宏观目标高并发绝不意味着只追求高性能&#xff0c;这是很多人片面的理解。2.2 微观目标2.2.1 性能指标2.2.2 可用性指标2.2.3 可扩展性指标03 高并发的实践方案有哪些&#xff1f;3.1 通用…

ubuntu ifconfig_Ubuntu 设置固定 IP 最简单的方法!

因为鼠标共享软件需要使用网络连接&#xff0c;台式机的 IP 总是变化导致笔记本每次重启都要重新配置 IP&#xff0c;所以我给 ubuntu 设置了固定 IP&#xff0c;方法很简单&#xff0c;直接再系统设置里面配置就可以了。1. 查看默认网络配置打开系统「Setting」&#xff0c;打…