`
b_l_east
  • 浏览: 639167 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

糞坑-SpringCloud中使用Feign的坑

 
阅读更多
示例如下:
@FeignClient("service-resource")
//@RequestMapping("/api/test")
public interface TestResourceItg {

   @RequestMapping(value = "/api/test/raw", method = RequestMethod.POST, consumes = "application/x-www-form-urlencoded")
   public String raw1(@PathVariable("subject") String subject, // 标题
                  @RequestParam("content") String content); // 内容

}
 
 
说明:
*使用RequestMapping中的consumes指定生成的请求的Content-Type
*RequestParam指定的参数会拼接在URL之后,如: ?name=xxx&age=18
*PathVariable指定的参数会放到一个LinkedHashMap<String, ?>传入到feign的Encoder中进行处理,而在Spring中实现了该接口的Encoder为SpringEncoder,而该实现又会使用Spring中的HttpMessageConverter进行请求体的写入。
 
 
坑:
*不要在接口类名上使用RequestMapping,虽然可以使用,但同时SpringMVC会把该接口的实例当作Controller开放出去,这个可以在启动的Mapping日志中查看到
*使用默认的SpringEncoder,在不指定consumes时,PathVariable中的参数会生成JSON字符串发送,且默认情况下不支持Form表单的生成方式,原因为:FormHttpMessageConverter只能处理MultiValueMap,而使用PathVariable参数被放在了HashMap中。默认更不支持文件上传。其实已经有支持处理各种情况的HttpMessageConverter存在。
 
填坑:
*支持Form表单提交:只需要编写一个支持Map的FormHttpMessageConverter即可,内部可调用FormHttpMessageConverter的方法简化操作。
*支持文件上传:只需要把要上传的文件封装成一个Resource(该Resource一定要实现filename接口,这个是把请求参数解析成文件的标识),使用默认的ResourceHttpMessageConverter处理即可。
*支持处理MultipartFile参数:编写一个支持MultipartFile的MultipartFileHttpMessageConverter即可,内部可调用ResourceHttpMessageConverter实现,同时注意需要将其添加至FormHttpMessageConverter的Parts中,并重写FormHttpMessageConverter的getFilename方法支持从MultipartFile中获取filename
*所有的HttpMessageConverter直接以@Bean的方式生成即可,spring会自动识别添加
 
完美支持表单和文件上传:
方案一:
使用附件中的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而来,未测

 

 
分享到:
评论
4 楼 wzmxml 2017-09-01  
楼主你好,有个问题想请教一下。
我使用了你上述的配置,以及对应的MultipartFileHttpMessageConverter
利用resourceHttpMessageConverter将数据写入request,但是调用远程服务的时候报出
the request was rejected because no multipart boundary was found错误。
打印请求头看到的是
POST /image/upload?catalogId={catalogId}&name={name}&userId={userId} HTTP/1.1
Accept: application/json;charset=UTF-8
Content-Type: multipart/form-data
Content-Length: 4814328
想问一下楼主有遇到类似的问题吗?
@RequestMapping(value = "/image/upload", method = RequestMethod.POST, produces = {
MediaType.APPLICATION_JSON_UTF8_VALUE }, consumes =MediaType.MULTIPART_FORM_DATA_VALUE)
public void upload(@RequestPart("file") MultipartFile file,
@RequestParam("catalogId") Integer catalogId, @RequestParam("name") String name,@RequestParam("userId") Integer userId);
feign client 我是这样添加的,是因为注解的问题么?? 看楼主的form表单貌似是以map提交的,不知是feign自动转成map的嘛?  如果是,那RequestParam里的值如何对应到??
还请不吝赐教,谢谢
3 楼 b_l_east 2017-08-22  
如若_晴 写道
急求答案,
楼主你好,我用springcloud 上传文件时,按照你的配置发送请求,结果一直报错:
Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile] and content type [multipart/form-data],我的Feign接口是这样的:
@RequestMapping(value = CGIConstants.ToolsApi.AGENT_FILE_UPLOAD, method = RequestMethod.POST ,consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    PolicyLoanStoreResponse agentFileUpload(@RequestParam(value = "store_state")Integer storeState,@RequestPart(value = "upload_file")MultipartFile file);

前端用ajax请求的,请问是怎么回事呢,还要在哪定义个HttpMessageConverter吗


不好意思,基本不看博客
建议你前后端分开测试一下,先使用postman对你的后端发请求,如果能上传成功,那说明是你前端设置错误,如果上传不成功,那就需要先修复后端了。
目前这部分我重新整理了一份放在github上:https://github.com/elvis9xu163/component-utils
使用很简单,只需要配置:
@Bean
public MapFormHttpMessageConverter mapFormHttpMessageConverter() {
return new MapFormHttpMessageConverter();
}
即可。另外:
@Bean
public RestTemplate restTemplate() {
return new AllEncompassingRestTemplate();
}
可以支持RestTemplate上传MultipartFile,且支持中文名文件上传
2 楼 紫水兰 2017-07-05  
如若_晴 写道
急求答案,
楼主你好,我用springcloud 上传文件时,按照你的配置发送请求,结果一直报错:
Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile] and content type [multipart/form-data],我的Feign接口是这样的:
@RequestMapping(value = CGIConstants.ToolsApi.AGENT_FILE_UPLOAD, method = RequestMethod.POST ,consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    PolicyLoanStoreResponse agentFileUpload(@RequestParam(value = "store_state")Integer storeState,@RequestPart(value = "upload_file")MultipartFile file);

前端用ajax请求的,请问是怎么回事呢,还要在哪定义个HttpMessageConverter吗

1 楼 如若_晴 2017-06-28  
急求答案,
楼主你好,我用springcloud 上传文件时,按照你的配置发送请求,结果一直报错:
Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile] and content type [multipart/form-data],我的Feign接口是这样的:
@RequestMapping(value = CGIConstants.ToolsApi.AGENT_FILE_UPLOAD, method = RequestMethod.POST ,consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    PolicyLoanStoreResponse agentFileUpload(@RequestParam(value = "store_state")Integer storeState,@RequestPart(value = "upload_file")MultipartFile file);

前端用ajax请求的,请问是怎么回事呢,还要在哪定义个HttpMessageConverter吗

相关推荐

    spring-cloud-user-feign.zip

    在本项目"spring-cloud-user-feign.zip"中,我们探讨的是如何在Spring Cloud框架下实现服务间的调用,特别是利用Feign客户端进行微服务通信。这个压缩包包含了四个关键组件,分别是: 1. spring-cloud-gateways:这...

    feign-form-spring-3.8.0-API文档-中文版.zip

    赠送jar包:feign-form-spring-3.8.0.jar; 赠送原API文档:feign-form-spring-3.8.0-javadoc.jar; 赠送源代码:feign-form-spring-3.8.0-sources.jar; 赠送Maven依赖信息文件:feign-form-spring-3.8.0.pom; ...

    springcloud-feign.zip

    springcloud整合openFeign,包括feign的基本使用、传参、指定特定的服务器、负载均衡等使用方法。...springcloud-feign-api springcloud-feign-consumer springcloud-feign-provider springcloud-feign-providerV2

    12.Spring Cloud中使用Feign

    下面我们将详细探讨如何在Spring Cloud中使用Feign,以及涉及到的相关知识点。 首先,我们要了解Feign的基本概念。Feign是一个构建在HTTP客户端之上的声明式Web服务客户端,它使得编写Web服务客户端就像编写服务器...

    spring-cloud-hystrix-feign(注册中心、member、feign-order).zip

    然后,"SpringCloud-2.0-order-hystrix-feign-8012"展示了如何使用Feign和Hystrix进行服务间调用。Feign是一个声明式Web服务客户端,使得编写Web服务客户端就像编写Java接口一样简单。在Order服务中,我们可以定义一...

    75-Spring Cloud Feign使用笔记1

    在本文中,我们将深入探讨如何使用 Feign,并了解其与 Spring Cloud 结合的工作原理。 首先,要在主应用类中启用 Feign,你需要添加 `@EnableFeignClients` 注解。这会告诉 Spring 扫描并创建 Feign 客户端实例,...

    SpringCloud-2.0-order-Feign-8005.zip

    5. **依赖管理**:在`pom.xml`中,引入了Spring Cloud的相关依赖,如`spring-cloud-starter-openfeign`, `spring-cloud-starter-netflix-eureka-client`等。 在实际开发中,开发者可以按照以下步骤使用Feign实现...

    微服务springcloud之feign使用demo

    除了Feign自带的注解外它还支持JAX-RS注解,SpringCloud又为Feign增加了对SpringMVC注解的支持,同时为了能够使用和Spring Web中默认使用的相同的httpMessageConverter,SpringCloud集成了Ribbon和Eureka,用来在...

    srping-cloud-alibaba-nacos-feign.zip

    而`spring-cloud-alibaba-demo-user`则为服务消费者,通过Feign接口调用`spring-cloud-alibaba-nacos`中的服务。 在实际开发中,我们还需要注意以下几点: 1. 服务消费者通过Nacos获取服务提供者的元数据,包括服务...

    springboot-springcloud.rar

    1. 添加依赖:在项目的`pom.xml`文件中引入SpringCloud的Eureka相关依赖。 2. 配置Eureka Server:在`application.yml`或`application.properties`中配置Eureka Server的相关属性,如端口、名称等。 3. 配置服务...

    Spring Cloud中关于Feign的常见问题总结

    SpringCloud中关于Feign的常见问题总结,包括常用的请求注解、@PathVariable、FeignClient多参数的构造等

    aware-extend-spring-cloud-feign-1.0.0.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    aware-extend-spring-cloud-feign-1.0.0-javadoc.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    aware-extend-spring-cloud-feign-1.0.0-sources.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    24-Spring Cloud服务间调用Feign1

    在 application.yml 文件中,我们需要配置 application name 为 feign-service。然后,我们需要在 FeignServiceApplication 类上添加 @EnableFeignClients 注解,以启用 Feign 客户端。 接下来,我们需要创建一个...

    Spring Cloud Feign统一设置验证token实现方法解析

    在微服务架构中, token验证是非常重要的安全机制之一,本文将主要介绍如何使用Spring Cloud Feign统一设置验证token实现方法解析。 首先,我们需要了解Feign组件的工作机制。Feign组件是一个基于Annotation的接口...

    Spring Cloud Netflix【spring cloud中文版】--spring cloud中文文档.pdf

    Spring Cloud Netflix是Spring Cloud项目的一部分,它提供了在分布式系统中实现常见模式的工具集,其核心功能之一是服务发现。在文档中,首先介绍了Eureka客户端,即服务注册与发现机制中的客户端组件。Eureka客户端...

    srping-cloud-alibaba-nacos-feign-sentinel.zip

    本示例以"spring-cloud-alibaba-nacos-feign-sentinel.zip"为核心,旨在展示如何将Nacos用于服务注册与发现,Feign实现服务间的无侵入调用,以及Sentinel作为流控防护屏障,构建一个高效且稳定的微服务体系。...

    study-springcloud2

    该项目采用 study-springcloud-root作为maven父项目,其余项目作为子项目的方式搭建。 eureka用户服务注册,config用于服务注册,config-client作为客户端注册,通过ribbon实现了客户端访问study-springcloud-...

Global site tag (gtag.js) - Google Analytics