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形式進行傳遞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章