Prevent registering the default exception mapper in the ExceptionMapperFactory to avoid skipping an other exception mapper for Throwable
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java b/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java
index b64fef0..7c51af4 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -180,6 +180,11 @@
for (ServiceHolder<ExceptionMapper> mapperHandle: mapperHandles) {
ExceptionMapper mapper = mapperHandle.getInstance();
+ // the default exception mapper is processed by the ServerRuntime
+ if ("org.glassfish.jersey.server.DefaultExceptionMapper".equals(mapper.getClass().getName())) {
+ continue;
+ }
+
if (Proxy.isProxyClass(mapper.getClass())) {
SortedSet<Class<? extends ExceptionMapper>> mapperTypes =
new TreeSet<>((o1, o2) -> o1.isAssignableFrom(o2) ? -1 : 1);
diff --git a/core-server/pom.xml b/core-server/pom.xml
index a5f1d9f..6e909e6 100644
--- a/core-server/pom.xml
+++ b/core-server/pom.xml
@@ -243,6 +243,12 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
+
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<profiles>
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/DefaultExceptionMapperTest.java b/core-server/src/test/java/org/glassfish/jersey/server/DefaultExceptionMapperTest.java
index 74b1153..724b3d9 100644
--- a/core-server/src/test/java/org/glassfish/jersey/server/DefaultExceptionMapperTest.java
+++ b/core-server/src/test/java/org/glassfish/jersey/server/DefaultExceptionMapperTest.java
@@ -22,12 +22,15 @@
import jakarta.ws.rs.container.CompletionCallback;
import jakarta.ws.rs.container.Suspended;
import jakarta.ws.rs.core.Response;
+import org.glassfish.jersey.internal.ExceptionMapperFactory;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
+import static org.assertj.core.api.Assertions.assertThat;
+
public class DefaultExceptionMapperTest {
public static final String MESSAGE = "DefaultExceptionMapperTest I/O Exception";
@Test
@@ -58,6 +61,17 @@
Assert.assertEquals(1, counter.get());
}
+ @Test
+ public void testDefaultExceptionMapperNotRegisteredInExceptionMapperFactory() {
+ ResourceConfig resourceConfig = new ResourceConfig();
+ ApplicationHandler applicationHandler = new ApplicationHandler(resourceConfig);
+
+ // use InjectionManager from ApplicationHandler to set up the default bindings
+ ExceptionMapperFactory exceptionMapperFactory = new ExceptionMapperFactory(applicationHandler.getInjectionManager());
+
+ assertThat(exceptionMapperFactory.find(Throwable.class)).isNull();
+ }
+
@Path("/")
public static class IOExThrowingResource {
private final CompletionCallback callback;