今天开发项目时,遇到一个需求,需要上传一个excel文件到微服务上,微服务是国外同事写的,我负责处理gateway和前端部分。在postman上测试接口没有问题了,就准备在代码就实现。但是遇到了一个问题,无论怎样都调用不成功。此时前端到gateway的调用是成功的,因为我可以把controller拿到的数据成功写入到本地。问题就出在gateway调用另一个微服务上。
@RequestMapping(value = "/import/excel", method = RequestMethod.POST)    public Object importTableExcel(@RequestParam("file") MultipartFile file, @RequestParam("tableName") String tableName, @RequestParam("importType") String importType) {        return ep2LookUpDBFeignClient.importTableExcel(file, tableName, importType);    }
这个是controller代码,前端用formData封装提交,这里用MultipartFile 接收。到这一步是没有问题的
@RequestMapping(value = "/api/tables/import/excel",        method = RequestMethod.POST,        produces = { MediaType.APPLICATION_JSON_UTF8_VALUE },        consumes = MediaType.MULTIPART_FORM_DATA_VALUE)    Object importTableExcel(@RequestParam("file") MultipartFile file,@RequestParam("tableName")String tableName, @RequestParam("importType")String importType);
这个是调用微服务的代码,问题就出在这里。但是我一开始也是百思不得其解,参数设置什么的都没有问题了,那怎么还会出错了。于是我各种找资料,然后在一篇文中,看到原来是注解写错了,MultipartFile 的注解应该是@RequestPart,而不是@RequestParam。改了之后果然可以了。
@RequestMapping(value = "/api/tables/import/excel",        method = RequestMethod.POST,        produces = { MediaType.APPLICATION_JSON_UTF8_VALUE },        consumes = MediaType.MULTIPART_FORM_DATA_VALUE)    Object importTableExcel(@RequestPart("file") MultipartFile file,@RequestParam("tableName")String tableName, @RequestParam("importType")String importType);
这个是可以成功运行的代码,在此记录一下,以免下次还犯同样的错误。以下是 @RequestParam和@RequestPart的区别1.@RequestPart这个注解用在multipart/form-data表单提交请求的方法上。 2.支持的请求方法的方式MultipartFile,属于Spring的MultipartResolver类。这个请求是通过                http协议传输的。 3.@RequestParam也同样支持multipart/form-data请求。 4.他们最大的不同是,当请求方法的请求参数类型不再是String类型的时候。 5.@RequestParam适用于name-valueString类型的请求域,@RequestPart适用于复杂的请求域(像JSON,XML)。