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后面;
下一篇:
工作一年,什么都不会!