场景
有这样一个接口,它的返回字段不是固定的,是根据传参来决定出参。
比如入参有“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);
}
}