SpringCloud FeignClient调用返回结果为null。

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这样,问题就完美解决。


版权声明:本文为weixin_43950168原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。