Skip to content

Commit e73651c

Browse files
geoandgsmet
authored andcommitted
Fix Throwable handling in @ServerExceptionMapper
Fixes: #18603 (cherry picked from commit 1aa3e26)
1 parent b66a004 commit e73651c

File tree

3 files changed

+134
-4
lines changed

3 files changed

+134
-4
lines changed

extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/ServerExceptionMapperGenerator.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161

6262
final class ServerExceptionMapperGenerator {
6363

64+
private static final DotName THROWABLE = DotName.createSimple(Throwable.class.getName());
65+
6466
private ServerExceptionMapperGenerator() {
6567
}
6668

@@ -136,7 +138,9 @@ public static Map<String, String> generatePerClassMapper(MethodInfo targetMethod
136138
MethodDescriptor rrToResponseDescriptor = toResponseDescriptor(handledExceptionType, generatedClassName);
137139

138140
// bridge toResponse(Throwable, ServerRequestContext) method
139-
generateRRResponseBridge(handledExceptionType, cc, rrToResponseDescriptor);
141+
if (!THROWABLE.equals(handledExceptionType.name())) {
142+
generateRRResponseBridge(handledExceptionType, cc, rrToResponseDescriptor);
143+
}
140144

141145
// RESTEasy Reactive toResponse(...) method
142146
generateRRResponse(targetMethod, targetClass, handledExceptionType, cc, rrToResponseDescriptor,
@@ -151,7 +155,9 @@ public static Map<String, String> generatePerClassMapper(MethodInfo targetMethod
151155
generatedClassName);
152156

153157
// bridge asyncResponse(Throwable, AsyncExceptionMapperContext) method
154-
generateRRUniResponseBridge(handledExceptionType, cc, rrAsyncResponseDescriptor);
158+
if (!THROWABLE.equals(handledExceptionType.name())) {
159+
generateRRUniResponseBridge(handledExceptionType, cc, rrAsyncResponseDescriptor);
160+
}
155161

156162
// RESTEasy Reactive asyncResponse(...) method
157163
generateRRUniResponse(targetMethod, targetClass, handledExceptionType, cc, rrAsyncResponseDescriptor,
@@ -261,7 +267,9 @@ public static Map<String, String> generateGlobalMapper(MethodInfo targetMethod,
261267
MethodDescriptor rrToResponseDescriptor = toResponseDescriptor(handledExceptionType, generatedClassName);
262268

263269
// bridge toResponse(Throwable, ServerRequestContext) method
264-
generateRRResponseBridge(handledExceptionType, cc, rrToResponseDescriptor);
270+
if (!THROWABLE.equals(handledExceptionType.name())) {
271+
generateRRResponseBridge(handledExceptionType, cc, rrToResponseDescriptor);
272+
}
265273

266274
// RESTEasy Reactive toResponse(...) method
267275
generateRRResponse(targetMethod, targetClass, handledExceptionType, cc, rrToResponseDescriptor,
@@ -271,7 +279,9 @@ public static Map<String, String> generateGlobalMapper(MethodInfo targetMethod,
271279
generatedClassName);
272280

273281
// bridge asyncResponse(Throwable, AsyncExceptionMapperContext) method
274-
generateRRUniResponseBridge(handledExceptionType, cc, rrAsyncResponseDescriptor);
282+
if (!THROWABLE.equals(handledExceptionType.name())) {
283+
generateRRUniResponseBridge(handledExceptionType, cc, rrAsyncResponseDescriptor);
284+
}
275285

276286
// RESTEasy Reactive asyncResponse(...) method
277287
generateRRUniResponse(targetMethod, targetClass, handledExceptionType, cc, rrAsyncResponseDescriptor,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package io.quarkus.resteasy.reactive.server.test.customexceptions;
2+
3+
import java.util.function.Supplier;
4+
5+
import javax.ws.rs.GET;
6+
import javax.ws.rs.Path;
7+
import javax.ws.rs.Produces;
8+
import javax.ws.rs.core.Response;
9+
10+
import org.jboss.resteasy.reactive.server.ServerExceptionMapper;
11+
import org.jboss.shrinkwrap.api.ShrinkWrap;
12+
import org.jboss.shrinkwrap.api.spec.JavaArchive;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.RegisterExtension;
15+
16+
import io.quarkus.test.QuarkusUnitTest;
17+
import io.restassured.RestAssured;
18+
19+
public class GlobalThrowableExceptionMapperTest {
20+
21+
@RegisterExtension
22+
static QuarkusUnitTest test = new QuarkusUnitTest()
23+
.setArchiveProducer(new Supplier<JavaArchive>() {
24+
@Override
25+
public JavaArchive get() {
26+
return ShrinkWrap.create(JavaArchive.class)
27+
.addClasses(Resource.class, ThrowableExceptionMapper.class);
28+
}
29+
});
30+
31+
@Test
32+
public void test() {
33+
RestAssured.get("/test/throwable")
34+
.then().statusCode(415);
35+
}
36+
37+
@Path("test")
38+
public static class Resource {
39+
@GET
40+
@Path("throwable")
41+
@Produces("text/plain")
42+
public String throwsThrowable() throws Throwable {
43+
throw new Throwable();
44+
}
45+
}
46+
47+
public static class ThrowableExceptionMapper {
48+
49+
@ServerExceptionMapper
50+
public Response handleThrowable(Throwable t) {
51+
return Response.status(415).build();
52+
}
53+
}
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package io.quarkus.resteasy.reactive.server.test.customexceptions;
2+
3+
import java.util.function.Supplier;
4+
5+
import javax.ws.rs.GET;
6+
import javax.ws.rs.Path;
7+
import javax.ws.rs.Produces;
8+
import javax.ws.rs.core.Response;
9+
10+
import org.jboss.resteasy.reactive.server.ServerExceptionMapper;
11+
import org.jboss.shrinkwrap.api.ShrinkWrap;
12+
import org.jboss.shrinkwrap.api.spec.JavaArchive;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.RegisterExtension;
15+
16+
import io.quarkus.test.QuarkusUnitTest;
17+
import io.restassured.RestAssured;
18+
19+
public class PerClassThrowableExceptionMapperTest {
20+
21+
@RegisterExtension
22+
static QuarkusUnitTest test = new QuarkusUnitTest()
23+
.setArchiveProducer(new Supplier<JavaArchive>() {
24+
@Override
25+
public JavaArchive get() {
26+
return ShrinkWrap.create(JavaArchive.class)
27+
.addClasses(HasCustomThrowableHandlerResource.class);
28+
}
29+
});
30+
31+
@Test
32+
public void test() {
33+
RestAssured.get("/custom/throwable")
34+
.then().statusCode(416);
35+
36+
RestAssured.get("/stock/throwable")
37+
.then().statusCode(500);
38+
}
39+
40+
@Path("custom")
41+
public static class HasCustomThrowableHandlerResource {
42+
43+
@ServerExceptionMapper
44+
public Response handleThrowable(Throwable t) {
45+
return Response.status(416).build();
46+
}
47+
48+
@GET
49+
@Path("throwable")
50+
@Produces("text/plain")
51+
public String throwsThrowable() throws Throwable {
52+
throw new Throwable();
53+
}
54+
}
55+
56+
@Path("stock")
57+
public static class DoesNotHaveCustomThrowableHandlerResource {
58+
59+
@GET
60+
@Path("throwable")
61+
@Produces("text/plain")
62+
public String throwsThrowable() throws Throwable {
63+
throw new Throwable();
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)