登录
    Technology changes quickly but people's minds change slowly.

feign 上传文件服务调用失败

技术宅 破玉 1993次浏览 0个评论

上传文件配置

增加如下依赖:

    
    		io.github.openfeign.form    
    		feign-form-spring    
    		<!--3.2.2    -->
  		    
  		    
      		io.github.openfeign.form    
      		feign-form    
      		3.2.2    
  		

增加相关配置:

@Configuration
public class FeignSupportConfig {
  @Bean
  public Encoder feignFormEncoder() {
    return new SpringFormEncoder();
  }
}

如果上传文件的时候有相关 requestbody 的参数接收

按照下面配置:

@Configuration
    public class MultipartSupportConfig {
 
        @Autowired
        private ObjectFactory messageConverters;
 
        @Bean
        @Primary
        @Scope("prototype")
        public Encoder feignEncoder() {
            return new SpringFormEncoder(new SpringEncoder(messageConverters));
        }
    }

编写 feignclient

@FeignClient(name = "rpt-file-service", fallback = FileUploadServiceFallback.class, configuration = FileUploadService.UserFeignConfig.class)
public interface FileUploadService {
    @RequestMapping(value = "/fdfs/upload", method = RequestMethod.POST,consumes= MediaType.MULTIPART_FORM_DATA_VALUE)
    @ResponseBody
    @CrossOrigin
    public Map upload(@RequestPart(value = "file", required = false) MultipartFile file) throws Exception;
}

增加FeginInterceptor 后,文件上传失败的处理

为了服务之间调用传递token,同事增加了如下方法:

@Configuration
    public class FeginInterceptor implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate requestTemplate) {
           
            try {
                Map headers = getHeaders();
                for(String headerName : headers.keySet()){
                    requestTemplate.header(headerName, headers.get(headerName));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        private Map getHeaders(){
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            Map map = new LinkedHashMap();
            Enumeration enumeration = request.getHeaderNames();
            while (enumeration.hasMoreElements()) {
                String key = enumeration.nextElement();
                String value = request.getHeader(key);
                map.put(key, value);
            }
            return map;
        }

    }

以上方法拦截所有的feign请求,重新设置了请求头,但也拦截了文件上传的请求头,导致服务端接收到的文件为空,调用失败,解决这个问题,需要放开对文件上传服务的拦截,修改如下代码:

@Configuration
    public class FeginInterceptor implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            //  文件上传不拦截请求
            if("/fdfs/upload".equals(requestTemplate.url())){
                return;
            }
            try {
                Map headers = getHeaders();
                for(String headerName : headers.keySet()){
                    requestTemplate.header(headerName, headers.get(headerName));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        private Map getHeaders(){
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            Map map = new LinkedHashMap();
            Enumeration enumeration = request.getHeaderNames();
            while (enumeration.hasMoreElements()) {
                String key = enumeration.nextElement();
                String value = request.getHeader(key);
                map.put(key, value);
            }
            return map;
        }

    }

华裳绕指柔, 版权所有丨如未注明 , 均为原创|转载请注明feign 上传文件服务调用失败
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址