在微服务项目的开发过程中,远程数据接口调用是必需的操作。其中绝大部分的接口写法和用法与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("/updateNoticeInfo")
public AjaxResult dynamicUpdateNoticeInfo(@RequestBody NoticeDTO noticeDTO) {
return AjaxResult.success(noticeService.updateNotice(noticeDTO));
}
- GET请求:多个属性传递,使用@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(NoticeDTO dto) {
return R.ok(noticeService.dynamicSelectNoticeList(dto));
}