Skip to content

Commit ba9496d

Browse files
committed
Simplify WebJars support
1 parent e9b0a19 commit ba9496d

File tree

6 files changed

+68
-300
lines changed

6 files changed

+68
-300
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceChainRegistration.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -27,7 +27,6 @@
2727
import org.springframework.web.servlet.resource.CachingResourceResolver;
2828
import org.springframework.web.servlet.resource.CachingResourceTransformer;
2929
import org.springframework.web.servlet.resource.CssLinkResourceTransformer;
30-
import org.springframework.web.servlet.resource.LiteWebJarsResourceResolver;
3130
import org.springframework.web.servlet.resource.PathResourceResolver;
3231
import org.springframework.web.servlet.resource.ResourceResolver;
3332
import org.springframework.web.servlet.resource.ResourceTransformer;
@@ -83,7 +82,6 @@ public ResourceChainRegistration(boolean cacheResources, @Nullable Cache cache)
8382
* @param resolver the resolver to add
8483
* @return the current instance for chained method invocation
8584
*/
86-
@SuppressWarnings("removal")
8785
public ResourceChainRegistration addResolver(ResourceResolver resolver) {
8886
Assert.notNull(resolver, "The provided ResourceResolver should not be null");
8987
this.resolvers.add(resolver);
@@ -93,7 +91,7 @@ public ResourceChainRegistration addResolver(ResourceResolver resolver) {
9391
else if (resolver instanceof PathResourceResolver) {
9492
this.hasPathResolver = true;
9593
}
96-
else if (resolver instanceof WebJarsResourceResolver || resolver instanceof LiteWebJarsResourceResolver) {
94+
else if (resolver instanceof WebJarsResourceResolver) {
9795
this.hasWebjarsResolver = true;
9896
}
9997
return this;
@@ -118,10 +116,10 @@ protected List<ResourceResolver> getResourceResolvers() {
118116
if (!this.hasPathResolver) {
119117
List<ResourceResolver> result = new ArrayList<>(this.resolvers);
120118
if (isWebJarVersionLocatorPresent && !this.hasWebjarsResolver) {
121-
result.add(new LiteWebJarsResourceResolver());
119+
result.add(new WebJarsResourceResolver());
122120
}
123121
else if (isWebJarAssetLocatorPresent && !this.hasWebjarsResolver) {
124-
result.add(new WebJarsResourceResolver());
122+
result.add(new WebJarsResourceResolver(new org.webjars.WebJarAssetLocator()));
125123
}
126124
result.add(new PathResourceResolver());
127125
return result;

spring-webmvc/src/main/java/org/springframework/web/servlet/resource/LiteWebJarsResourceResolver.java

Lines changed: 0 additions & 112 deletions
This file was deleted.

spring-webmvc/src/main/java/org/springframework/web/servlet/resource/WebJarsResourceResolver.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
package org.springframework.web.servlet.resource;
1818

1919
import java.util.List;
20+
import java.util.function.BiFunction;
2021

2122
import jakarta.servlet.http.HttpServletRequest;
2223
import org.webjars.WebJarAssetLocator;
24+
import org.webjars.WebJarVersionLocator;
2325

2426
import org.springframework.core.io.Resource;
2527
import org.springframework.lang.Nullable;
@@ -46,34 +48,38 @@
4648
* @since 4.2
4749
* @see org.springframework.web.servlet.config.annotation.ResourceChainRegistration
4850
* @see <a href="https://www.webjars.org">webjars.org</a>
49-
* @see LiteWebJarsResourceResolver
50-
* @deprecated as of Spring Framework 6.2 in favor of {@link LiteWebJarsResourceResolver}
5151
*/
52-
@Deprecated(forRemoval = true)
5352
public class WebJarsResourceResolver extends AbstractResourceResolver {
5453

55-
private static final String WEBJARS_LOCATION = "META-INF/resources/webjars/";
54+
private static final int WEBJARS_LOCATION_LENGTH = "META-INF/resources/webjars/".length();
5655

57-
private static final int WEBJARS_LOCATION_LENGTH = WEBJARS_LOCATION.length();
58-
59-
60-
private final WebJarAssetLocator webJarAssetLocator;
56+
private final BiFunction<String, String, String> webJarVersionLocator;
6157

6258

6359
/**
64-
* Create a {@code WebJarsResourceResolver} with a default {@code WebJarAssetLocator} instance.
60+
* Create a {@code WebJarsResourceResolver} with a default {@code WebJarVersionLocator} instance.
6561
*/
6662
public WebJarsResourceResolver() {
67-
this(new WebJarAssetLocator());
63+
this(new WebJarVersionLocator());
64+
}
65+
66+
/**
67+
* Create a {@code WebJarsResourceResolver} with a custom {@code WebJarVersionLocator} instance,
68+
* e.g. with a custom cache implementation.
69+
*/
70+
public WebJarsResourceResolver(WebJarVersionLocator webJarVersionLocator) {
71+
this.webJarVersionLocator = webJarVersionLocator::fullPath;
6872
}
6973

7074
/**
7175
* Create a {@code WebJarsResourceResolver} with a custom {@code WebJarAssetLocator} instance,
7276
* e.g. with a custom index.
7377
* @since 4.3
78+
* @deprecated as of Spring Framework 6.2
7479
*/
80+
@Deprecated(forRemoval = true)
7581
public WebJarsResourceResolver(WebJarAssetLocator webJarAssetLocator) {
76-
this.webJarAssetLocator = webJarAssetLocator;
82+
this.webJarVersionLocator = webJarAssetLocator::getFullPathExact;
7783
}
7884

7985

@@ -109,12 +115,12 @@ protected String resolveUrlPathInternal(String resourceUrlPath,
109115

110116
@Nullable
111117
protected String findWebJarResourcePath(String path) {
112-
int startOffset = (path.startsWith("/") ? 1 : 0);
113118
int endOffset = path.indexOf('/', 1);
114119
if (endOffset != -1) {
120+
int startOffset = (path.startsWith("/") ? 1 : 0);
115121
String webjar = path.substring(startOffset, endOffset);
116122
String partialPath = path.substring(endOffset + 1);
117-
String webJarPath = this.webJarAssetLocator.getFullPathExact(webjar, partialPath);
123+
String webJarPath = this.webJarVersionLocator.apply(webjar, partialPath);
118124
if (webJarPath != null) {
119125
return webJarPath.substring(WEBJARS_LOCATION_LENGTH);
120126
}

spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistryTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@
3131
import org.springframework.web.servlet.resource.CachingResourceResolver;
3232
import org.springframework.web.servlet.resource.CachingResourceTransformer;
3333
import org.springframework.web.servlet.resource.CssLinkResourceTransformer;
34-
import org.springframework.web.servlet.resource.LiteWebJarsResourceResolver;
3534
import org.springframework.web.servlet.resource.PathResourceResolver;
3635
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
3736
import org.springframework.web.servlet.resource.ResourceResolver;
3837
import org.springframework.web.servlet.resource.ResourceTransformer;
3938
import org.springframework.web.servlet.resource.VersionResourceResolver;
39+
import org.springframework.web.servlet.resource.WebJarsResourceResolver;
4040
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
4141
import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
4242
import org.springframework.web.testfixture.servlet.MockServletContext;
@@ -140,7 +140,7 @@ void resourceChain() {
140140
zero -> assertThat(zero).isInstanceOfSatisfying(CachingResourceResolver.class,
141141
cachingResolver -> assertThat(cachingResolver.getCache()).isInstanceOf(ConcurrentMapCache.class)),
142142
one -> assertThat(one).isEqualTo(mockResolver),
143-
two -> assertThat(two).isInstanceOf(LiteWebJarsResourceResolver.class),
143+
two -> assertThat(two).isInstanceOf(WebJarsResourceResolver.class),
144144
three -> assertThat(three).isInstanceOf(PathResourceResolver.class));
145145
assertThat(handler.getResourceTransformers()).satisfiesExactly(
146146
zero -> assertThat(zero).isInstanceOf(CachingResourceTransformer.class),
@@ -153,7 +153,7 @@ void resourceChainWithoutCaching() {
153153

154154
ResourceHttpRequestHandler handler = getHandler("/resources/**");
155155
assertThat(handler.getResourceResolvers()).hasExactlyElementsOfTypes(
156-
LiteWebJarsResourceResolver.class, PathResourceResolver.class);
156+
WebJarsResourceResolver.class, PathResourceResolver.class);
157157
assertThat(handler.getResourceTransformers()).isEmpty();
158158
}
159159

@@ -169,7 +169,7 @@ void resourceChainWithVersionResolver() {
169169
assertThat(handler.getResourceResolvers()).satisfiesExactly(
170170
zero -> assertThat(zero).isInstanceOf(CachingResourceResolver.class),
171171
one -> assertThat(one).isSameAs(versionResolver),
172-
two -> assertThat(two).isInstanceOf(LiteWebJarsResourceResolver.class),
172+
two -> assertThat(two).isInstanceOf(WebJarsResourceResolver.class),
173173
three -> assertThat(three).isInstanceOf(PathResourceResolver.class));
174174
assertThat(handler.getResourceTransformers()).hasExactlyElementsOfTypes(
175175
CachingResourceTransformer.class, CssLinkResourceTransformer.class);
@@ -179,7 +179,7 @@ void resourceChainWithVersionResolver() {
179179
void resourceChainWithOverrides() {
180180
CachingResourceResolver cachingResolver = mock();
181181
VersionResourceResolver versionResolver = mock();
182-
LiteWebJarsResourceResolver webjarsResolver = mock();
182+
WebJarsResourceResolver webjarsResolver = mock();
183183
PathResourceResolver pathResourceResolver = new PathResourceResolver();
184184
CachingResourceTransformer cachingTransformer = mock();
185185
CssLinkResourceTransformer cssLinkTransformer = new CssLinkResourceTransformer();

0 commit comments

Comments
 (0)