Cześć, powstała mi taka o to magia z Either i Try. Ogólnie chodzi o to, że Retry ma reagować tylko na jeden exception i zwracać jeden ApiError, pozostałe mają być łapane i opakowywane w inny ApiError. Musiałem ten FeignAdapter opakować, bo inaczej zanim AOP zadziałało i Retry wszedł to Try łapał już FeignException.InternalServerErrror i niestety zwracało mi INTERNAL_ERROR. Doszedłem do takiej wiązanki gdzie na końcu muszę zrobić .flatMap(t -> t), a jestem pewny że da się to zrobić ładniej.. Już chyba try catch wygląda lepiej. Dlatego wzywam specjalistów od FP i Vavra. Ewentualnie może widzi ktoś w ogóle jakieś rozwiązanie bez tych wrapperów... Z góry dzięki za pomoc wszystkim.
class FeignAdapter {
@Retry(name = "sample", fallbackMethod = "retryResponse")
public Either<ApiError, CommandResult> get(Command command) {
return Either.right(feignClient.getCalculations(command))
}
public Either<ApiError, CommandResult> retryResponse(Command command, FeignException.InternalServerError exc) {
return Either.left(ApiError.builder()
.errorType(ErrorType.SERVICE_UNAVAILABLE)
.build());
}
}
class Clazz {
private final FeignAdapter feignAdapter;
public Either<ApiError, CommandResult> get(Command command) {
return Try.of(() -> feignAdapter.get(command))
.toEither(
ApiError.builder()
.errorType(ErrorType.INTERNAL_ERROR)
.build()
)
.flatMap(t -> t);
}
}