FeignClient带文件多对象传参

该博客讨论了在使用Feign客户端调用服务时遇到的参数问题。生产者的接口接受HttpServletRequest、ChunkBO和MergeFileBO三个参数,文件信息存储于HttpServletRequest中。消费者尝试通过@RequestPart和额外的对象参数调用此接口时,遇到了'Method has too many Body parameters'的错误。解决方案是使用@SpringQueryMap注解,将ChunkBO和MergeFileBO参数转换为类似于@RequestParam的方式,从而避免了错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生产者:

  @ApiOperation(value = "切块上传", notes = "切块上传")
    @PostMapping("/uploadChunk")
    public Result uploadChunk( HttpServletRequest request,ChunkBO chunkBO,MergeFileBO mergeFileBO
    ) throws Exception {
        LOGGER.info("==========chunk " + chunkBO.getChunk());
        //1、校验参数,校验文件格式是否合法,创建空文件
        Chunk chunk = BeanUtil.convertBean(chunkBO, Chunk.class);
        chunk.setUserId("admin");
        chunk.setUserName("admin");
        chunk.setUuid(mergeFileBO.getUuid());
        chunk.setFileId(mergeFileBO.getFileId());
        chunk.setName(mergeFileBO.getFileName());
        chunk.setSize(mergeFileBO.getTotalSize());
        chunk.setCurrentSize(chunkBO.getSize());
        chunk.setFileMD5(mergeFileBO.getFileMD5());
        Part part = request.getPart("file");
        InputStream inputStream = part.getInputStream();
        chunk.setInputStream(inputStream);
        chunk.setFileType(part.getContentType());
        System.out.println("========uuid="+chunk.getUuid());
        ‘’‘’
        }

生产者这边的接口是参数分别是HttpServletRequest ,ChunkBO ,MergeFileBO 这三个参数,从 Part part = request.getPart("file")看出文件已经封装到了HttpServletRequest 请求对象中。

消费者:

消费者这边按照平时的restful风格来调用的话就会:

@FeignClient(name = "filesys-service-provider1",  url = "${image.show.host}", path = "/filesys-perpc")
public interface SeaWeedsImageUploadClient {

    @PostMapping(value = "/uploadChunk", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    Result<Long> uploadChunk(@RequestPart("file")  MultipartFile file,ChunkBO chunkBO,MergeFileBO mergeFileBO);
}

这样来调用,但是这样调用Feign会报java.lang.IllegalStateException: Method has too many Body parameters这样的错误,由于是多个对象所以也不能使用@RequestBody注解,而且生产者那边也没有使用RequestBody来接收参数,所以肯定不能用@RequestBody注解。
解决方案:

@FeignClient(name = "filesys-service-provider1",  url = "${image.show.host}", path = "/filesys-perpc")
public interface SeaWeedsImageUploadClient {

    @PostMapping(value = "/uploadChunk", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    Result<Long> uploadChunk(@RequestPart("file")  MultipartFile file,@SpringQueryMap ChunkBO chunkBO,@SpringQueryMap MergeFileBO mergeFileBO);
}

@SpringQueryMap:可以封装在对象里面的参数,自动解析成类似于@RequestParam的方式,将参数跟在url后面;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值