在微服务项目的开发过程中,远程数据接口调用是必需的操作。其中绝大部分的接口写法和用法与api相似,但是对于List<Obj>这种对象的参数使用需要异常关注。
1.List<Obj>对象集合参数传递
注意:
- Feign接口不能直接使用List<Obj>传参,需要通过json转成字符串
- 如果是List<单属性>,如List<String>则无需转化,按api接口规范直接传递即可。
- 另外需要注意对参数大小的限制
feign客户端
java"> /*** 批量新增来自外部通知提醒数据* 1.Feign接口不能直接使用List<Obj>传参,需要通过json转成字符串* 2.另外需要注意对参数大小的限制* @param dtoStr*/@PostMapping(value = "/batchAddNotice")void batchAddNoticeData(@RequestParam("dtoList") String dtoStr);
服务提供方
java"> /*** 批量新增来自外部调用的通知数据* @param dtoStr*/@PostMapping(value = "/batchAddNotice")public void batchAddNoticeData(@RequestParam("dtoList") String dtoStr) {List<NoticeDTO> dtoList = JSONArray.parseArray(dtoStr.trim(), NoticeDTO.class);noticeService.batchAddNoticeData(dtoList);}
服务调用方
java">/**
* 仅展示部分关键代码
* List<Obj>须通过FastJson将其转换为String之后再进行传递
**/
if(CollectionUtils.isNotEmpty(noticeDTOList)){remoteNoticeService.batchAddNoticeData(JSONObject.toJSONString(noticeDTOList,SerializerFeature.DisableCircularReferenceDetect));}
2.其他参数传递
- POST:单个Obj对象传递,使用@RequestBody注解
java"> //feign客户端@PostMapping("/test/updateNoticeInfo")void dynamicUpdateNoticeInfo(@RequestBody NoticeDTO noticeDTO);//服务提供方@PostMapping(value = "/batchAddNotice")public void batchAddNoticeData(@RequestParam("dtoList") String dtoStr) {List<NoticeDTO> dtoList = JSONArray.parseArray(dtoStr.trim(), NoticeDTO.class);noticeService.batchAddNoticeData(dtoList);}
- GET:单个Obj对象传递,使用@SpringQueryMap注解
注意:
- 该注解是Spring Cloud OpenFeign提供的,也可以用于feign客户端,OpenFeign提供的QueryMap注解与Spring不兼容。
- 该注解用于将POJO或Map参数注释为查询参数映射,与Spring类似。
java"> //feign客户端@GetMapping("/test/getNoticeList")R<List<NoticeDTO>> dynamicGetNoticeList(@SpringQueryMap NoticeDTO dto);//服务提供放端@GetMapping("/selectNoticeList")public R<List<NoticeDTO>> dynamicSelectNoticeList(NoticeDTOdto) {return R.ok(noticeService.dynamicSelectNoticeList(dto));}