ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Feign 调用 带有上传图片接口 导致服务点 调用失败 解决方案

2022-06-19 17:32:17  阅读:128  来源: 互联网

标签:Feign 调用 feign template new import MultipartFile 上传 public


创建 FeignConfig

点击查看代码
@Configuration
public class FeignConfig {
    @Bean
    public Decoder customErrorDecoder() {
        return new FeignClientDecoder();
    }
    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;
    @Bean
    @Primary
    @Scope("prototype")
    public Encoder multipartFormEncoder() {
        return new FeignSpringFormEncoder(new SpringEncoder(messageConverters));
    }

}

创建方法FeignSpringFormEncoder

点击查看代码
package com.zhuzaocloud.vcs.app.config;

import feign.RequestTemplate;
import feign.codec.EncodeException;
import feign.codec.Encoder;
import feign.form.ContentType;
import feign.form.FormEncoder;
import feign.form.MultipartFormContentProcessor;
import feign.form.spring.SpringManyMultipartFilesWriter;
import feign.form.spring.SpringSingleMultipartFileWriter;
import org.springframework.web.multipart.MultipartFile;

import java.lang.reflect.Type;
import java.util.*;

public class FeignSpringFormEncoder extends FormEncoder {
    public FeignSpringFormEncoder() {
        this(new Default());
    }
    public FeignSpringFormEncoder(Encoder delegate) {
        super(delegate);
        MultipartFormContentProcessor processor = (MultipartFormContentProcessor) this.getContentProcessor(ContentType.MULTIPART);
        processor.addFirstWriter(new SpringManyMultipartFilesWriter());
        processor.addFirstWriter(new SpringSingleMultipartFileWriter());
    }
    @Override
    public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
        //修改为下面的代码
        if (bodyType.equals(MultipartFile.class)) {
            MultipartFile file = (MultipartFile) object;
            Map<String, Object> data = Collections.singletonMap(file.getName(), object);
            super.encode(data, MAP_STRING_WILDCARD, template);
            return;
        } else if (bodyType.equals(MultipartFile[].class)) {
            MultipartFile[] file = (MultipartFile[]) object;
            if (file != null) {
                Map<String, Object> data = Collections.singletonMap(file.length == 0 ? "" : file[0].getName(), object);
                super.encode(data, MAP_STRING_WILDCARD, template);
                Map<String, Collection<String>> headers = template.headers();
                Collection<String> strings = headers.get("Content-Type");
                Collection<String> a = new ArrayList<>();
                strings.stream().forEach(x -> {
                    if (x.startsWith("multipart/form-data; charset=UTF-8; boundary=")) {
                        a.add(x);
                    }
                });
                Map<String, Collection<String>> res = new TreeMap<>();
                template.headers(res);
                res.put("Content-Length", headers.get("Content-Length"));
                res.put("Content-Type", a);
                template.headers(res);
                return;
            }
        }
        super.encode(object, bodyType, template);
    }
}

标签:Feign,调用,feign,template,new,import,MultipartFile,上传,public
来源: https://www.cnblogs.com/zxy-come-on/p/16390891.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有