遇到過一個問題,記錄解決。有個類似於開放平臺的服務,一些功能需要去調用別的微服務。查詢列表調用其餘服務的時候需要進行調用另外一個服務的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形式進行傳遞。