aboutsummaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2021-04-30 19:52:54 +0200
committerJon Marius Venstad <venstad@gmail.com>2021-04-30 19:52:54 +0200
commitfd902f33fb92b00352fc515a8b37b5580db99387 (patch)
tree135dce41f96d304b059b7334e85bd54415378d72 /container-core
parent9ae792a7da30bb89373b8739cbe4f5ba996a1978 (diff)
Sort mappers according to class hierarchy to match most specific mapper
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java6
1 files changed, 4 insertions, 2 deletions
diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
index e5da3e52165..29f1c2d294b 100644
--- a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
+++ b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
@@ -14,6 +14,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
@@ -151,11 +152,12 @@ class RestApiImpl implements RestApi {
private static List<ExceptionMapperHolder<?>> combineWithDefaultExceptionMappers(
List<ExceptionMapperHolder<?>> configuredExceptionMappers, boolean disableDefaultMappers) {
- List<ExceptionMapperHolder<?>> exceptionMappers = new ArrayList<>();
+ List<ExceptionMapperHolder<?>> exceptionMappers = new ArrayList<>(configuredExceptionMappers);
if (!disableDefaultMappers){
exceptionMappers.add(new ExceptionMapperHolder<>(RestApiException.class, (context, exception) -> exception.response()));
}
- exceptionMappers.addAll(configuredExceptionMappers);
+ // Topologically sort children before superclasses, so most the specific match is found by iterating through mappers in order.
+ exceptionMappers.sort((a, b) -> a.type.isAssignableFrom(b.type) ? 1 : b.type.isAssignableFrom(a.type) ? -1 : 0);
return exceptionMappers;
}