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);
}
}