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;