package com.volvo.web.api.feign;
import feign.RequestTemplate;
import feign.codec.EncodeException;
import feign.codec.Encoder;
import feign.form.FormEncoder;
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.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class FormSupportConfig {
// new一个form编码器,实现支持form表单提交
@Bean
Encoder feignFormEncoder() {
return new MyEncoder();
}
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);
return;
}
super.encode(object, bodyType, template);
}
}
}
@FeignClient(contextId = "OpenWareHouseFeign",value = ServiceNameConstants.OPEN_WAREHOUSE,url = "${feign.sn.open-warehouse}",configuration = FormSupportConfig.class)
public interface OpenWareHouseFeign {
@PostMapping(value = "/openapi/og/createOrder",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
String createOrder(@RequestBody Map<String, Object> params);
<!-- 引入文件feign文件上传依赖 -->
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.0.3</version>
</dependency>