使用Spring Cloud Feign上传文件的示例
最近经常有人问Spring Cloud Feign如何上传文件。有团队的新成员,也有其他公司的兄弟。本文简单做个总结―― 早期的Spring Cloud中,Feign本身是没有上传文件的能力的(1年之前),要想实现这一点,需要自己去编写Encoder 去实现上传。现在我们幸福了很多。因为Feign官方提供了子项目feign-form ,其中实现了上传所需的 Encoder 。 注:笔者测试的版本是Edgware.RELEASE。Camden、Dalston同样适应本文所述。 加依赖 <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.0.3</version> </dependency>
@FeignClient(name = "ms-content-sample",configuration = UploadFeignClient.MultipartSupportConfig.class) public interface UploadFeignClient { @RequestMapping(value = "/upload",method = RequestMethod.POST,produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @ResponseBody String handleFileUpload(@RequestPart(value = "file") MultipartFile file); class MultipartSupportConfig { @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(); } } } 如代码所示,在这个Feign Client中,我们引用了配置类MultipartSupportConfig ,在MultipartSupportConfig 中,我们实例化了SpringFormEncoder 。这样这个Feign Client就能够上传啦。 注意点 @RequestMapping(value = "/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) 中的produeces 、consumes 不能少; 接口定义中的注解@RequestPart(value = "file") 不能写成@RequestParam(value = "file" 。 最好将Hystrix的超时时间设长一点,例如5秒,否则可能文件还没上传完,Hystrix就超时了,从而导致客户端侧的报错。 SpringCloud中使用Feign的坑 示例如下: @FeignClient("service-resource") //@RequestMapping("/api/test") public interface TestResourceItg { @RequestMapping(value = "/api/test/raw",consumes = "application/x-www-form-urlencoded") public String raw1(@PathVariable("subject") String subject,// 标题 @RequestParam("content") String content); // 内容 } 说明: *使用RequestMapping中的consumes指定生成的请求的Content-Type 坑: *不要在接口类名上使用RequestMapping,虽然可以使用,但同时SpringMVC会把该接口的实例当作Controller开放出去,这个可以在启动的Mapping日志中查看到 填坑: *支持Form表单提交:只需要编写一个支持Map的FormHttpMessageConverter即可,内部可调用FormHttpMessageConverter的方法简化操作。 完美支持表单和文件上传: 方案一: 使用附件中的MapFormHttpMessageConverter.java和MultipartFileHttpMessageConverter.java 在Spring中进行如下配置即可 @Bean public MapFormHttpMessageConverter mapFormHttpMessageConverter(MultipartFileHttpMessageConverter multipartFileHttpMessageConverter) { MapFormHttpMessageConverter mapFormHttpMessageConverter = new MapFormHttpMessageConverter(); mapFormHttpMessageConverter.addPartConverter(multipartFileHttpMessageConverter); return mapFormHttpMessageConverter; } @Bean public MultipartFileHttpMessageConverter multipartFileHttpMessageConverter() { return new MultipartFileHttpMessageConverter(); } 方案二: 使用FeignSpringFormEncoder.java 在Spring中配置如下: @Bean public Encoder feignEncoder(ObjectFactory<HttpMessageConverters> messageConverters) { return new FeignSpringFormEncoder(messageConverters); } 推荐使用方案一 方案二为参考https://github.com/pcan/feign-client-test而来,未测 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 在本地模式下运行storm-starter拓扑时出现ClassNot
- java – Tomcat 7挂起初始化Spring根WebApplicationContext
- 详解Java的堆内存与栈内存的存储机制
- java – 是否可以使用Hibernate Criteria在多个列上搜索相同
- 为什么会选择使用finally语句而不是catch语句? (JAVA)
- Hibernate Criteria接口 setMaxResults方法:设置最大返回记
- java基于swing实现的五子棋游戏代码
- Java使用String类格式化当前日期实现代码
- java – 获取Class [Runtime-Type Token]的实例
- JSP Out对象的其他println方法