先做个feign调用方法
@Component
@RequestMapping("fegin")
@FeignClient(value = "fegin-server", fallbackFactory = ServerFeignFallbackFactory.class)
public interface EdgeServerDingTalkFeign {
/**
* 根据用户id获取用户详情
*/
@GetMapping("member/detail")
OapiUserGetResponse fetchMemberDetail(@RequestParam String userId);
}
然后异常捕获
ServerFeignFallbackFactory
@Slf4j
@Component
public class ServerFeignFallbackFactory implements FallbackFactory<ServerFeign> {
private final RestApiException feignException = RestApiException.error(ErrCode.FEIGN_REST_FALLBACK, "feign fallback exception");
@Override
public ServerFeign create(Throwable throwable) {
return new ServerFeign() {
@Override
public OapiUserGetResponse fetchMemberDetail(String userId) {
log.error("fetchMemberDetail feign error", throwable);
throw feignException;
}
};
}
}
第二种方法做个自定义注解去拦截
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface FeignExceptionApi {
}
@Slf4j
@Aspect
@Component
public class FeignExceptionApiAspect {
@Around(value = "(@annotation(feignExceptionApi) || @within(feignExceptionApi))")
Object around4Method(ProceedingJoinPoint joinPoint, FeignExceptionApi feignExceptionApi){
Object proceed = null;
try {
proceed = joinPoint.proceed();
} catch (Throwable throwable) {
Throwable t = Optional.ofNullable(throwable.getCause()).orElseGet(() -> new Throwable("未知异常"));
log.error("FeignException:{},原因:{}", throwable.getMessage(), t.getMessage());
throw FeignRequestException.error("子系统调用异常");
}
return proceed;
}
}
构造实体类
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
public class FeignRequestException extends RuntimeException {
private String errMsg;
public static FeignRequestException error(String errMsg) {
return FeignRequestException.builder()
.errMsg(errMsg)
.build();
}
}
调用feign的方法加上注解\@FeignExceptionApi