Uni <Void> как получить ответ об ошибке или успехе при вызове REST

Я пытаюсь настроить простой ответ об успехе / неудаче после того, как сервер отправил электронное письмо.

Однако даже после нескольких часов перебора множества вариантов я все еще не получаю правильного ответа.

Пример кода, который просто дает ответ принятый здесь:

@GET
@Path("/async")
public CompletionStage<Response> sendASimpleEmailAsync() {
    return reactiveMailer.send(
            Mail.withText("to@acme.org", "A reactive email from quarkus", "This is my body"))
            .subscribeAsCompletionStage()
            .thenApply(x -> Response.accepted().build());
}

Однако, когда письмо не было успешно отправлено, я хочу дать еще один ответ здесь. Я пробовал вот что (но это неудачная попытка Uni):

@GET
@Path("/async")
public Uni<Void> sendASimpleEmailAsync() {
    final Mail mailToBeSent =  Mail.withText("to@acme.org", "A reactive email from quarkus", "This is my body");

    return (Uni<Void>) reactiveMailer.send(mailToBeSent)
            .then( response -> {
                if (response == null) {
                    return Response.accepted();
                }
            });
}

Вывод в консоль (когда почта не отправлялась из-за неправильного пароля):

[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.5.1.Final:dev (default-cli) on project h21-microservices: Unable to execute mojo: Compilation failure: 
[ERROR] /FeedbackResource.java:[36,32] lambda body is neither value nor void compatible
[ERROR] /FeedbackResource.java:[36,13] method then in interface io.smallrye.mutiny.Uni<T> cannot be applied to given types;
[ERROR]   required: java.util.function.Function<io.smallrye.mutiny.Uni<java.lang.Void>,O>
[ERROR]   found: (response)[...]; } }
[ERROR]   reason: cannot infer type-variable(s) O
[ERROR]     (argument mismatch; bad return type in lambda expression
[ERROR]       missing return value)
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

И еще вариант:

@GET
@Path("/async")
public Cancellable sendASimpleEmailAsync() {
    final Mail mailToBeSent =  Mail.withText("to@acme.org", "A reactive email from quarkus", "This is my body");

    Uni<Void> stage = reactiveMailer.send(mailToBeSent);
    return stage.subscribe().with(
        result -> {  System.out.println("Result with " + result); Response.accepted();  },
        failure -> { System.out.println("Failure with " + failure); Response.status(Status.BAD_GATEWAY); }
    );
}

Журнал консоли (с println). Он выполняется после того, как я получаю принятый вывод клиента.

Failure with io.vertx.core.impl.NoStackTraceThrowable: AUTH CRAM-MD5 failed 530 Invalid username or password

Вывод клиента (когда письмо не было отправлено из-за неправильного пароля):

HTTP/1.1 200 OK
Content-Length: 57
Content-Type: text/plain;charset=UTF-8

io.smallrye.mutiny.helpers.UniCallbackSubscriber@3fa06fdb

Но бот безуспешно. Я просто хочу узнать, было ли письмо отправлено или произошла ошибка при его отправке. Есть ли у кого-нибудь какие-нибудь идеи, советы о том, как действовать?

1 ответ

Решение

Вы можете использовать мятеж onFailure().recoverWithItem() возможность указать отдельный ответ для использования в случае сбоя:

@GET
@Path("/async")
public Uni<Response> sendASimpleEmailAsync() {
    return reactiveMailer.send(
            Mail.withText("to@acme.org", "A reactive email from quarkus", "This is my body"))
            .map(a -> Response.accepted().build())
            .onFailure().recoverWithItem(Response.serverError().build());
}

Обратите внимание, что вам понадобится quarkus-resteasy-mutiny вернуть Uni напрямую и избегайте преобразования в CompletionStage, но это имеет гораздо больше смысла, если вы делаете это регулярно.

Другие вопросы по тегам