summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorjonmv <venstad@gmail.com>2024-02-27 10:08:04 +0100
committerjonmv <venstad@gmail.com>2024-02-27 10:08:04 +0100
commitfd8a182a634feb18dedd07a3868b701af0b6cb16 (patch)
treeb8398ff7f447199767c7b18c387b60b6884c7760 /container-core
parent3677c04f0a48634c7183db0e1f9330cb13f3be4e (diff)
Sort after filter, so total order exists
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java12
1 files changed, 3 insertions, 9 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 a69d46a95a2..a381fd3c9a6 100644
--- a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
+++ b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
@@ -172,7 +172,9 @@ class RestApiImpl implements RestApi {
log.log(Level.FINE, e, e::getMessage);
ExceptionMapperHolder<?> mapper = exceptionMappers.stream()
.filter(holder -> holder.type.isAssignableFrom(e.getClass()))
- .findFirst().orElseThrow(() -> e);
+ // Topologically sort children before superclasses, so most the specific match is found by iterating through mappers in order.
+ .min((a, b) -> (a.type.isAssignableFrom(b.type) ? 1 : 0) + (b.type.isAssignableFrom(a.type) ? -1 : 0))
+ .orElseThrow(() -> e);
return mapper.toResponse(context, e);
}
@@ -210,14 +212,6 @@ class RestApiImpl implements RestApi {
if (!disableDefaultMappers){
exceptionMappers.addAll(RestApiMappers.DEFAULT_EXCEPTION_MAPPERS);
}
- // Topologically sort children before superclasses, so most the specific match is found by iterating through mappers in order.
- exceptionMappers.sort((l, r) -> {
- if (l.type.equals(r.type)) return 0;
- if (l.type.isAssignableFrom(r.type)) return 1;
- if (r.type.isAssignableFrom(l.type)) return -1;
- // Ensure global ordering when no inheritance relationship exists
- return l.type.getName().compareTo(r.type.getName());
- });
return exceptionMappers;
}