diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceChainRegistration.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceChainRegistration.java index 92a75bedd7..93a21b8938 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceChainRegistration.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceChainRegistration.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,6 +56,8 @@ public class ResourceChainRegistration { private boolean hasCssLinkTransformer; + private boolean hasWebjarsResolver; + public ResourceChainRegistration(boolean cacheResources) { this(cacheResources, cacheResources ? new ConcurrentMapCache(DEFAULT_CACHE_NAME) : null); @@ -84,6 +86,9 @@ public class ResourceChainRegistration { else if (resolver instanceof PathResourceResolver) { this.hasPathResolver = true; } + else if (resolver instanceof WebJarsResourceResolver) { + this.hasWebjarsResolver = true; + } return this; } @@ -104,7 +109,7 @@ public class ResourceChainRegistration { protected List getResourceResolvers() { if (!this.hasPathResolver) { List result = new ArrayList(this.resolvers); - if (isWebJarsAssetLocatorPresent) { + if (isWebJarsAssetLocatorPresent && !this.hasWebjarsResolver) { result.add(new WebJarsResourceResolver()); } result.add(new PathResourceResolver()); @@ -114,7 +119,7 @@ public class ResourceChainRegistration { } protected List getResourceTransformers() { - if (this.hasVersionResolver && !this.hasCssLinkTransformer) { + if (this.hasVersionResolver && !this.hasCssLinkTransformer) { List result = new ArrayList(this.transformers); boolean hasTransformers = !this.transformers.isEmpty(); boolean hasCaching = hasTransformers && this.transformers.get(0) instanceof CachingResourceTransformer; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/WebJarsResourceResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/WebJarsResourceResolver.java index 395cad1f3e..7bfee2b142 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/WebJarsResourceResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/WebJarsResourceResolver.java @@ -17,6 +17,7 @@ package org.springframework.web.servlet.resource; import java.util.List; + import javax.servlet.http.HttpServletRequest; import org.webjars.MultipleMatchesException; @@ -49,8 +50,23 @@ public class WebJarsResourceResolver extends AbstractResourceResolver { private final static int WEBJARS_LOCATION_LENGTH = WEBJARS_LOCATION.length(); - private final WebJarAssetLocator webJarAssetLocator = new WebJarAssetLocator(); + private final WebJarAssetLocator webJarAssetLocator; + /** + * Create a {@code WebJarsResourceResolver} with a default {@code WebJarAssetLocator} instance. + */ + public WebJarsResourceResolver() { + this(new WebJarAssetLocator()); + } + + /** + * Create a {@code WebJarsResourceResolver} with a custom {@code WebJarAssetLocator} instance, + * e.g. with a custom index. + * @since 4.3.0 + */ + public WebJarsResourceResolver(WebJarAssetLocator webJarAssetLocator) { + this.webJarAssetLocator = webJarAssetLocator; + } @Override protected Resource resolveResourceInternal(HttpServletRequest request, String requestPath, diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistryTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistryTests.java index 1530dc7791..66965ed569 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistryTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistryTests.java @@ -180,6 +180,7 @@ public class ResourceHandlerRegistryTests { public void resourceChainWithOverrides() throws Exception { CachingResourceResolver cachingResolver = Mockito.mock(CachingResourceResolver.class); VersionResourceResolver versionResolver = Mockito.mock(VersionResourceResolver.class); + WebJarsResourceResolver webjarsResolver = Mockito.mock(WebJarsResourceResolver.class); PathResourceResolver pathResourceResolver = new PathResourceResolver(); CachingResourceTransformer cachingTransformer = Mockito.mock(CachingResourceTransformer.class); AppCacheManifestTransformer appCacheTransformer = Mockito.mock(AppCacheManifestTransformer.class); @@ -189,6 +190,7 @@ public class ResourceHandlerRegistryTests { .resourceChain(false) .addResolver(cachingResolver) .addResolver(versionResolver) + .addResolver(webjarsResolver) .addResolver(pathResourceResolver) .addTransformer(cachingTransformer) .addTransformer(appCacheTransformer) @@ -196,10 +198,11 @@ public class ResourceHandlerRegistryTests { ResourceHttpRequestHandler handler = getHandler("/resources/**"); List resolvers = handler.getResourceResolvers(); - assertThat(resolvers.toString(), resolvers, Matchers.hasSize(3)); + assertThat(resolvers.toString(), resolvers, Matchers.hasSize(4)); assertThat(resolvers.get(0), Matchers.sameInstance(cachingResolver)); assertThat(resolvers.get(1), Matchers.sameInstance(versionResolver)); - assertThat(resolvers.get(2), Matchers.sameInstance(pathResourceResolver)); + assertThat(resolvers.get(2), Matchers.sameInstance(webjarsResolver)); + assertThat(resolvers.get(3), Matchers.sameInstance(pathResourceResolver)); List transformers = handler.getResourceTransformers(); assertThat(transformers, Matchers.hasSize(3));