From f4a57784d964e9c6f66f5536606698f1efe4233e Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Wed, 6 Mar 2024 10:40:50 +0200 Subject: [PATCH] Unwrap processing exception from REST Client when returning a Uni Originally reported at: https://stackoverflow.com/q/78108545/2504224 (cherry picked from commit 3e602388db108a2ba5e64023c147aec552db3cb6) --- .../error/ResponseExceptionMapperTest.java | 18 ++++++++++++++++-- .../reactive/client/impl/UniInvoker.java | 10 ++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/extensions/resteasy-reactive/rest-client-reactive/deployment/src/test/java/io/quarkus/rest/client/reactive/error/ResponseExceptionMapperTest.java b/extensions/resteasy-reactive/rest-client-reactive/deployment/src/test/java/io/quarkus/rest/client/reactive/error/ResponseExceptionMapperTest.java index a676a44fd8b60..578afc39708d2 100644 --- a/extensions/resteasy-reactive/rest-client-reactive/deployment/src/test/java/io/quarkus/rest/client/reactive/error/ResponseExceptionMapperTest.java +++ b/extensions/resteasy-reactive/rest-client-reactive/deployment/src/test/java/io/quarkus/rest/client/reactive/error/ResponseExceptionMapperTest.java @@ -19,6 +19,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.quarkus.test.QuarkusUnitTest; +import io.smallrye.mutiny.Uni; public class ResponseExceptionMapperTest { @RegisterExtension @@ -34,8 +35,11 @@ public class ResponseExceptionMapperTest { @Test void shouldInvokeExceptionMapperOnce() { - assertThrows(RuntimeException.class, client::get); + assertThrows(TestException.class, client::get); assertThat(MyExceptionMapper.executionCount.get()).isEqualTo(1); + + assertThrows(TestException.class, () -> client.uniGet().await().indefinitely()); + assertThat(MyExceptionMapper.executionCount.get()).isEqualTo(2); } @Path("/error") @@ -51,6 +55,9 @@ public Response returnError() { public interface Client { @GET String get(); + + @GET + Uni uniGet(); } @Provider @@ -61,7 +68,14 @@ public static class MyExceptionMapper implements ResponseExceptionMapper Uni method(String name, Entity entity, GenericType responseT public CompletionStage get() { return invoker.method(name, entity, responseType); } + }).onFailure().transform(new Function<>() { + @Override + public Throwable apply(Throwable t) { + if ((t instanceof ProcessingException) && (t.getCause() != null)) { + return t.getCause(); + } + return t; + } }); }