Я не могу понять, как выделить этот код.
private CompletionStage<Response<String>> foo(RequestContext rc) {
final Optional<String> campaignIdOpt = rc.request().parameter("campaignId").filter(s -> !s.isEmpty());
final Optional<String> creativeIdOpt = rc.request().parameter("creativeId").filter(s -> !s.isEmpty());
Optional<Uuid> campaignIdOptOfUuid = Optional.empty();
if (campaignIdOpt.isPresent()) {
try {
campaignIdOptOfUuid = Optional.of(UuidUtils.fromString(campaignIdOpt.get()));
} catch (IllegalArgumentException e) {
LOG.error(String.format("Invalid campaignId: %s", campaignIdOpt.get()), e);
return CompletableFuture.completedFuture(
Response.forStatus(Status.BAD_REQUEST.withReasonPhrase("Invalid campaignId provided.")));
}
}
Optional<Uuid> creativeIdOptOfUuid = Optional.empty();
if (creativeIdOpt.isPresent()) {
try {
creativeIdOptOfUuid = Optional.of(UuidUtils.fromString(creativeIdOpt.get()));
} catch (IllegalArgumentException e) {
LOG.error(String.format("Invalid creativeId: %s", creativeIdOpt.get()), e);
return CompletableFuture.completedFuture(
Response.forStatus(Status.BAD_REQUEST.withReasonPhrase("Invalid creativeId provided.")));
}
}
// Simplified, do something with Uuids.
return bar(campaignIdOptOfUuid, creativeIdOptOfUuid);
}
По сути, нам очень часто приходится анализировать протобуф Google Uuid
s из строки запроса для передачи другому сервису, которыйнайдет (или не найдет).Нам нужно передать пустой необязательный параметр, если параметр не был задан, или пустую строку, поскольку оба случая означают «Не фильтровать по этому параметру».Наконец, если строка вообще не анализируется, мы хотим немедленно вернуть ошибку 400 (неверный запрос), а не передавать бессмысленный параметр в службу.
Итак, по кодам янужен вспомогательный метод, который
- принимает
Optional<String>
, а - возвращает
Optional<Uuid>
, если присутствует, Optional.empty()
в противном случае и - , если исключение
return
выдает ошибку из оригинального контекста.
Но, очевидно, я не могу "двойного возврата".Какой шаблон я использую для достижения этой цели, хотя?Я пытался создать инкапсулятор для Optional<Uuid>
и CompletionStage<Response<String>>
, но это было неудобно.Есть какой-то идиоматический способ сделать это?