1. 问题现象
- 1.调用一次feign接口发现既走了正常接口也走了回调接口
2. 初始代码
import com.baomidou.mybatisplus.core.metadata.IPage;
/**
* 信息查询Feign接口类
*
*/
@FeignClient(
name="test",
fallback = ISearchClientFallback.class
)
public interface ISearchClient {
String API_PREFIX = "/client";
String LIST_BY_USER = API_PREFIX + "/search/user";
/**
* 用户信息查询
* @param name
* @param current
* @param size
* @return
*/
@GetMapping(LIST_BY_USER)
R<IPage<UserVO>> userSearch(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "current", required = false) int current,
@RequestParam(value = "size", required = false) int size);
}
/**
* 信息远程调用失败处理类
*
*/
@Component
public class ISearchClientFallback implements ISearchClient {
@Override
public R<IPage<UserVO>> userSearch(String name, int current, int size) {
return R.fail("远程调用失败");
}
}
3. 代码修改
/**
* 信息查询Feign接口类
*/
@FeignClient(
name="test",
fallbackFactory = ISearchClientFallback.class
)
public interface ISearchClient {
String API_PREFIX = "/client";
String LIST_BY_USER = API_PREFIX + "/search/user";
/**
* 用户信息查询
* @param name
*/
@GetMapping(LIST_BY_USER)
R<IPage<UserVO>> userSearch(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "current", required = false) int current,
@RequestParam(value = "size", required = false) int size);
@Component
public class ISearchClientFallback implements FallbackFactory<ISearchClient> {
@Override
public ISearchClient create(Throwable throwable) {
// 打印错误日志
throwable.printStackTrace();
return new ISearchClient() {
@Override
public R<MyPage<UserVO>> search(String userName, Query query) {
return null;
}
};
}
}
4. 处理
- 1.将feign接口中的fallback改为fallbackFactory
- 2.回调接口ISearchClientFallback继承FallbackFactory,并打印错误日志
- 3.重启服务重新调用接口
5. 异常信息分析
- 1.异常信息
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fea9948104f32883f028494383f56c77.png)
- 2.说是IPage是接口,不能实例化,因此可以自定义MyPage实现IPage接口进行转化
6. 改过后的代码
/**
* 信息查询Feign接口类
*/
@FeignClient(
name="test",
fallback = ISearchClientFallback.class
)
public interface ISearchClient {
String API_PREFIX = "/client";
String LIST_BY_USER = API_PREFIX + "/search/user";
/**
* 用户信息查询
* @param name
* @param current
* @param size
* @return
*/
@GetMapping(LIST_BY_USER)
R<MyPage<UserVO>> userSearch(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "current", required = false) int current,
@RequestParam(value = "size", required = false) int size);
}
/**
* 信息远程调用失败处理类
*
*/
@Component
public class ISearchClientFallback implements ISearchClient {
@Override
public R<MyPage<UserVO>> userSearch(String name, int current, int size) {
return R.fail("远程调用失败");
}
}