aboutsummaryrefslogtreecommitdiffstats
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
parent9ae792a7da30bb89373b8739cbe4f5ba996a1978 (diff)
Sort mappers according to class hierarchy to match most specific mapper
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java2
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java6
2 files changed, 5 insertions, 3 deletions
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java
index 9913de3e017..a6cf6d24c88 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java
@@ -83,7 +83,7 @@ public class TenantHandlerTest {
public void testTenantCreateWithAllPossibleCharactersInName() throws Exception {
TenantName tenantName = TenantName.from("aB-9999_foo");
assertNull(tenantRepository.getTenant(tenantName));
- assertResponse(PUT, "/application/v2/tenant/aB-999;9_foo",
+ assertResponse(PUT, "/application/v2/tenant/aB-9999_foo",
"{\"message\":\"Tenant " + tenantName + " created.\"}");
}
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;
}