feign以form方式提交多个参数,以map进行传递

向大家介绍feign以form方式提交多个参数,主要包括feign以form方式提交多个参数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题,FeignClient多参数使用@RequestParam传递
代码示例:

@RequestMapping("send2User")
	String send2User(@RequestParam("sign")String sign,
						@RequestParam("fromUsername")String fromUsername,
						@RequestParam("toUsername")String toUsername,
						@RequestParam("content")String content,
						@RequestParam("isImmediately")Integer isImmediately,
						@RequestParam("ext")String ext);

参数改为map:
添加依赖,这两个是feign团队扩展的jar包,用于form提交的

<dependency>
  <groupId>io.github.openfeign.form</groupId>
  <artifactId>feign-form</artifactId>
  <version>3.2.2</version>
</dependency>

<dependency>
  <groupId>io.github.openfeign.form</groupId>
  <artifactId>feign-form-spring</artifactId>
  <version>3.2.2</version>
</dependency>

创建一个Encoder,其中关键一句是:super.encode(data, MAP_STRING_WILDCARD, template)

import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;

import feign.RequestTemplate;
import feign.codec.EncodeException;
import feign.form.spring.SpringFormEncoder;

public class MyEncoder extends SpringFormEncoder{

	public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
		
		if (((ParameterizedTypeImpl) bodyType).getRawType().equals(Map.class)) {
            Map<String,?> data = (Map<String, ?>) object;
            Set<String> nullSet = new HashSet<>();
            for (Map.Entry<String, ?> entry : data.entrySet()) {
                if (entry.getValue() == null) {
                    nullSet.add(entry.getKey());
                }
            }
            for (String s : nullSet) {
                data.remove(s);
            }
            super.encode(data, MAP_STRING_WILDCARD, template);
//            int i=1/0;
            return;
        }
		super.encode(object, bodyType, template);
	}
}

注意:加一句int i=1/0;可以debug找出源码调用的流程
创建一个config,引入自定义的Encoder

import org.springframework.context.annotation.Bean;
import feign.codec.Encoder;

public class FormSupportConfig {
	@Bean
	public Encoder feignFormEncoder() {
		return new MyEncoder();
//		return new SpringFormEncoder();
	}
}

client的注解加上config

@FeignClient(value="chatclient",path="chatclient",configuration=FormSupportConfig.class)

方法修改为map参数

@PostMapping(value = "send2User", consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })
String send2User(Map<String, String> map);

注意:feignclient中其他方法不用修改,可以兼容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值