A项目远程调用另一项目时是用http方式进行请求的,使用的工具是FeignClient, 以下是FeignClient的踩坑日记
1.在服务的启动入口,即main方法所在的类上需要加一个EnableFeignClients注解,并且如果需要扫描的包不在该类所属的同一包下,需要加上basePackages,否则可能会生成一个代理对象,并且报错

1
Invalid bound statement (not found): xxx.common.xx.xx.xxXClient.getXxxList

解决方法如下:

1
2
3
4
5
6
7
8
@EnableFeignClients(basePackages = {"test.common"})
public class Main {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Main.class);
application.setBannerMode(Banner.Mode.OFF);
application.run(args);
}
}

2.xxClient接口下的方法的响应需要加上@NoArgsConstructor 注解( 或者高版本可以用@Jacksonized), 否则会导致反序列化失败

3.调试技巧,xxClient接口下的方法如果获取不到响应或者不是预期响应,可以先用Object作为方法的返回值。观察返回信息。举例:

1
2
3
4
5
6
7
// 修改前如下
@PostMapping("/v1/admin/push_task/add")
ApiResponse createPushTask(@RequestBody @Validated ApiRequest requestBody);
// 经过Object分析,发现接收到的响应只剩CreatePushTaskResData,
// 最外层ApiReponse不知道在哪里被剥离出去了。修改后如下:
@PostMapping("/v1/admin/push_task/add")
CreatePushTaskResData createPushTask(@RequestBody @Validated ApiRequest requestBody);