遇到过一个问题,记录解决。有个类似于开放平台的服务,一些功能需要去调用别的微服务。查询列表调用其余服务的时候需要进行调用另外一个服务的GET请求,对方服务的GET请求需要使用一个DTO接受。dto就是一个实体。各种属性表示查询条件。
@RequestMapping(value = "/store/api/v1/salesmen/{salesmanId}/admin/loaning", method = RequestMethod.GET)
String searchLoaning(@PathVariable("salesmanId") String salesmanId,
@RequestParam("loaningParam") SearchLoaningParamDTO loaningParam,
@RequestParam(value = "pageNo") Integer pageNo,
@RequestParam(value = "pageSize") Integer pageSize);
初始版本。想在fegin调用的时候直接传一个相同结构的dto(loaningParam)作为参数传递过去。但是另一个微服务接受不到。此时,加了个Interceptor在请求对方服务的时候先进行过滤下,打了个断点,发现传递的过程中loaningParam转换成了key为loaningparam,value为json的结构。改进后:
@RequestMapping(value = "/store/api/v1/salesmen/{salesmanId}/admin/loaning", method = RequestMethod.GET)
String searchLoaning(@PathVariable("salesmanId") String salesmanId,
@RequestParam("param") Map<String,Object> loanParam);
将要传递的参数组装成Map的结构,这时候再Interceptor打个断点发现自动组装成了key为map的key,value为map中的value格式。完美解决。
最后,将一个DTO转成Map的方法附上,使用反射做到
public static Map<String, Object> objectToMap(Object obj) throws IllegalAccessException {
Map<String, Object> map = new HashMap<>();
Class<?> clazz = obj.getClass();
System.out.println(clazz);
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String fieldName = field.getName();
Object value = field.get(obj);
if (value != null) {
map.put(fieldName, value);
}
}
return map;
}
是在解决完问题一段时间后才写的文章,当时断点调试结果没保留,只能以语言的形式表达下。
一句话综述下,就是在以GET形式调用接口的时候,如果接受的参数中有Bean的情况下,将Bean转换成为Map形式进行传递。