From 29b38375b0a794fe35d633a1a55d793801735ed4 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 --- .../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 a676a44fd8b600..578afc39708d23 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) { + return t.getCause(); + } + return t; + } }); }