Spring Cloud Feign Client 上传文件

一消费者

1application.yml配置

  #默认支持文件上传
spring:
  servlet:
    multipart:
      enabled: true
       resolve-lazily: true

2POM



    io.github.openfeign.form
    feign-form-spring
    3.2.2


    io.github.openfeign.form
    feign-form
    3.2.2


    commons-fileupload
    commons-fileupload
    1.3

3Feign

package com.apiserver.consumer.console.api.mall;

import com.apiserver.model.mall.entity.MEquipment;
import com.apiserver.model.system.response.PageInfo;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;
@FeignClient(name = "producer-mall/v1/equipment",configuration = EquipmentInterface.FeignMultipartSupportConfig.class)
public interface EquipmentInterface {

 
 
    @RequestMapping(value = "save", method = RequestMethod.POST)
    public Map save(@RequestBody MEquipment equipment);


 
    @RequestMapping(value = "batchSave", method = {RequestMethod.POST}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Map batchSave(@RequestPart("file") MultipartFile  file) ;
 

    /**
     *
     * 描述:该multipartFormEncoder会对所有的页面请求就行处理,所以不能放到全局配置中,也就是不能添加@Configuration注解
		所以我将它配置内部类,该配置EquipmentInterface起作用。
     * @author: feizhou
     * @date :2019/1/11 11:26
     * @param :
     * @return
     */
      class FeignMultipartSupportConfig {
        @Autowired
        private ObjectFactory messageConverters;
        @Bean
        @Primary
        @Scope("prototype")
        public Encoder multipartFormEncoder() {
//new SpringEncoder(messageConverters):防止feign.codec.EncodeException: class xxxx is  not a type supported by this encoder.
            return new SpringFormEncoder(new SpringEncoder(messageConverters));
        }
        @Bean
        public feign.Logger.Level multipartLoggerLevel() {
            return feign.Logger.Level.FULL;
        }

    }


}

为什么会有feign.codec.EncodeException: class xxxx is  not a type supported by this encoder.

假设代码配置是这样的
       

     @Bean
        @Primary
        @Scope("prototype")
        public Encoder multipartFormEncoder() {
            return new SpringFormEncoder();
        }

查看执行源码

Spring Cloud Feign Client 上传文件_第1张图片

当我们页面请求的时候

Spring Cloud Feign Client 上传文件_第2张图片

 

Spring Cloud Feign Client 上传文件_第3张图片

因为我们没有传值 new SpringFormEncoder();父类构造的时候

Spring Cloud Feign Client 上传文件_第4张图片

对于的encoder方法

Spring Cloud Feign Client 上传文件_第5张图片

也就是说,SpringFormEncoder()如果我们不传参数的话,当我们form表单提交(后台实体接收的时候),代码执行

encode方法,对实体对象object就行判断,如果不是字符串或者字节数组,就抛  class xxxx is  not a type supported by this encoder。

 

现在我们加了实体又会怎么样呢

Spring Cloud Feign Client 上传文件_第6张图片

Spring Cloud Feign Client 上传文件_第7张图片

 

上图我们知道:SpringEncoder implements Encoder。

接下继续解析如下

 
SpringFormEncoder(Encoder delegate)构造调用super(delegate);

 在调用父类前,我们是使用(Encoder)delegate这个参数。上面我们知道,这个参数实际是什么(策略模式)。

delegate为:

Spring Cloud Feign Client 上传文件_第8张图片

当我们请求的时候

Spring Cloud Feign Client 上传文件_第9张图片

Spring Cloud Feign Client 上传文件_第10张图片

 

也就是下图的方法

Spring Cloud Feign Client 上传文件_第11张图片

 

4消费者controller

    @RequestMapping(value = "batchSave", method = RequestMethod.POST)
    public JsonResult> batchSave(@RequestParam(value = "file")  MultipartFile file) {
        return JsonResult.getSuccessResult(equipmentInterface.batchSave(file));
    }

二提供者

    public Map batchSave(@RequestParam(value = "file") MultipartFile file {


    }

1application.yml配置

  #默认支持文件上传
spring:
  servlet:
    multipart:
      enabled: true
       resolve-lazily: true

你可能感兴趣的:(java基础)