FeignClient使用泛型接收数据

场景

有这样一个接口,它的返回字段不是固定的,是根据传参来决定出参。
比如入参有“key1”,“key2”,“key5”,分别取数据库中key1,key2,key5的值,最后返回这样的形式:

[
  {"key1":"value1.1", "key2":"value2.1", "key5":"value5.1"}, 
  {"key1":"value1.2", "key2":"value2.2", "key5":"value5.2"}
]

通常代码

Controller

@RestController
public class DynamicController {

	@GetMapping("dynamicOuput")
	public List<Map<String, Object>> dynamicOuput(@RequestParam List<String> keys) {
		return myDao.getValue(keys);
	}
}

FeignClient:

@FeignClient(value = "http://myserver")
public interface DynamicFeignClient {

    @GetMapping("dynamicOuput")
	List<Map<String, Object>> dynamicOuput(@RequestParam List<String> keys);
}

需求

对于Feign的使用方来说,他是知道结果应该有哪些字段的,所以想用一个已知的DTO去接收feignClient的值

思路

其实得到Map类型的数据后,使用各种DTO转化框架是很方便的进行类型的转换的,如果不想每次都转,可以把这个过程封装在FeignClient的接口定义中(必须保证JDK 1.8以上)

方法

FeignClient:

@FeignClient(value = "http://myserver")
public interface DynamicFeignClient {
    ObjectMapper objectMapper = new ObjectMapper();
    
    @GetMapping("dynamicOuput")
	List<Map<String, Object>> dynamicOuput(@RequestParam List<String> keys);
	
	default <T> List<T> dynamicOuput(List<String> keys, Class<T> tClass) {
		return this.dynamicOuput(keys).stream().map(mapData -> objectMapper.convertValue(mapData, tClass)).collect(Collectors.toList()));
	}
}

使用

MyDto.java

@Data
public class MyDto {
	private String key1;
	private String key2;
	private String key3;
}

MyService.java

@Service
public class MyService {
	@Autowired
	DynamicFeignClient dynamicFeignClient;

	private List<String> keys = Arrays.asList("key1", "key2", "key3");
	
	public List<MyDto> myMethod() {
		List<String> keys = 
		return dynamicFeignClient.dynamicOutput(keys, MyDto.class);
	}
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值