diff options
author | jonmv <venstad@gmail.com> | 2024-02-27 10:08:04 +0100 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2024-02-27 10:08:04 +0100 |
commit | fd8a182a634feb18dedd07a3868b701af0b6cb16 (patch) | |
tree | b8398ff7f447199767c7b18c387b60b6884c7760 /container-core | |
parent | 3677c04f0a48634c7183db0e1f9330cb13f3be4e (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.java | 12 |
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; } |