fegin请求中使用GET方法在服务之间进行调用传递的参数是对象

遇到过一个问题,记录解决。有个类似于开放平台的服务,一些功能需要去调用别的微服务。查询列表调用其余服务的时候需要进行调用另外一个服务的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形式进行传递。

猜你喜欢

转载自blog.csdn.net/weixin_41818715/article/details/82776411