diff --git a/src/main/java/org/springframework/hateoas/server/core/WebHandler.java b/src/main/java/org/springframework/hateoas/server/core/WebHandler.java index 79c7791c..adec03b2 100644 --- a/src/main/java/org/springframework/hateoas/server/core/WebHandler.java +++ b/src/main/java/org/springframework/hateoas/server/core/WebHandler.java @@ -38,7 +38,7 @@ import org.springframework.hateoas.TemplateVariables; import org.springframework.hateoas.server.LinkBuilder; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.ConcurrentReferenceHashMap; +import org.springframework.util.ConcurrentLruCache; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.ObjectUtils; @@ -63,7 +63,8 @@ public class WebHandler { public static final MappingDiscoverer DISCOVERER = CachingMappingDiscoverer .of(new PropertyResolvingMappingDiscoverer(new AnnotationMappingDiscoverer(RequestMapping.class))); - private static final Map> AFFORDANCES_CACHE = new ConcurrentReferenceHashMap<>(); + private static final ConcurrentLruCache> AFFORDANCES_CACHE = new ConcurrentLruCache<>( + 256, key -> SpringAffordanceBuilder.create(key.type, key.method, key.href.toUriString(), DISCOVERER)); public interface LinkBuilderCreator { T createBuilder(UriComponents components, TemplateVariables variables, List affordances); @@ -160,9 +161,8 @@ public class WebHandler { variables = variables.concat(variable); } - List affordances = AFFORDANCES_CACHE.computeIfAbsent( - new AffordanceKey(invocation.getTargetType(), invocation.getMethod(), components), - key -> SpringAffordanceBuilder.create(key.type, key.method, key.href.toUriString(), DISCOVERER)); + List affordances = AFFORDANCES_CACHE + .get(new AffordanceKey(invocation.getTargetType(), invocation.getMethod(), components)); return creator.createBuilder(components, variables, affordances); };