FeignClient带文件多对象传参

生产者:

@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后面;

经验分享 程序员 微信小程序 职场和发展