SpringCloud FeignClient调用返回结果为null。
(1)远端服务如下:
@ApiOperation("[+]获取系统所有的项目")
@RequestMapping(value="/all", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public AppResponse<List> all() {
// 1、分步查询,先查出所有项目
// 2、再查询这些项目图片
List<ProjectVo> prosVo = new ArrayList<>();
// 1、连接查询,所有的项目left join 图片表,查出所有的图片
// left join:笛卡尔积 A*B 1000万*6 = 6000万
// 大表禁止连接查询;
List<TProject> pros = projectInfoService.getAllProjects();
for (TProject tProject : pros) {
Integer id = tProject.getId();
List<TProjectImages> images = projectInfoService.getProjectImages(id);
ProjectVo projectVo = new ProjectVo();
BeanUtils.copyProperties(tProject, projectVo);
。。。。。。。。。
return AppResponse.ok(prosVo);
}
(2)FeignClient定义如下:
@FeignClient(value=“SCW-PROJECT”,fallback=ProjectInfoServiseFeignExceptionHandler.class)
public interface ProjectInfoServiseFeign {
@RequestMapping(value="project/all", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public AppResponse<List<ProjectVo>> all();
}
(3)使用FeignClient调用远端服务代码省略。。。
每次返回结果都是null。因为无参,所以不是@RequestParam的问题;
经百度,发现可能是Feign在组装Http请求去调用远端服务时 请求头参数有问题。所以加上【produces = MediaType.APPLICATION_JSON_UTF8_VALUE】。完美解决
总结:consumes定义了方法接受的Http的请求类型,produces则定义了Http请求返回的类型。
FeignClient,它的底层实现,就是根据定义的FeignClient,来组装Http请求进行远程调用,而Http默认的Content-type是x-www-form-urlencoded类型化。
因此,我们可以在FeignClient的定义上,指定produces = MediaType.APPLICATION_JSON_UTF8_VALUE,这样,FeignClient在组装Http请求的时候,就会在header里面设置响应的数据类型为application/json;charset=UTF-8这样,问题就完美解决。