Configure ResourceUrlProvider in WebFlux

Prior to this commit, no `ResourceUrlProvider` was configured
in WebFlux (no bean was contributed by the WebFlux infrastructure).
Also, several `ResourceTransformer` instances that extend the
`ResourceTransformerSupport` base class need a `ResourceUrlProvider`
to resolve absolute URLs when rewriting resource URLs. At this point,
no `ResourceUrlProvider` was configured and they could only resolve
relative URLs.

This commit contributes a new `ResourceUrlProvider` to the WebFlux
configuration; this bean can be reused by the WebFlux infrastructure and
application code.

This also automatically configure this shared `ResourceUrlProvider`
instance on the resource chain where needed.

Issue: SPR-17433
This commit is contained in:
Brian Clozel
2018-10-26 13:48:45 +02:00
parent 3fee8cb625
commit fc957e95bb
4 changed files with 49 additions and 3 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 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.
@@ -43,6 +43,8 @@ import org.springframework.web.reactive.resource.CssLinkResourceTransformer;
import org.springframework.web.reactive.resource.PathResourceResolver;
import org.springframework.web.reactive.resource.ResourceResolver;
import org.springframework.web.reactive.resource.ResourceTransformer;
import org.springframework.web.reactive.resource.ResourceTransformerSupport;
import org.springframework.web.reactive.resource.ResourceUrlProvider;
import org.springframework.web.reactive.resource.ResourceWebHandler;
import org.springframework.web.reactive.resource.VersionResourceResolver;
import org.springframework.web.reactive.resource.WebJarsResourceResolver;
@@ -120,8 +122,11 @@ public class ResourceHandlerRegistryTests {
@Test
public void resourceChain() throws Exception {
ResourceUrlProvider resourceUrlProvider = Mockito.mock(ResourceUrlProvider.class);
this.registry.setResourceUrlProvider(resourceUrlProvider);
ResourceResolver mockResolver = Mockito.mock(ResourceResolver.class);
ResourceTransformer mockTransformer = Mockito.mock(ResourceTransformer.class);
ResourceTransformerSupport mockTransformer = Mockito.mock(ResourceTransformerSupport.class);
this.registration.resourceChain(true).addResolver(mockResolver).addTransformer(mockTransformer);
ResourceWebHandler handler = getHandler("/resources/**");
@@ -138,6 +143,7 @@ public class ResourceHandlerRegistryTests {
assertThat(transformers, Matchers.hasSize(2));
assertThat(transformers.get(0), Matchers.instanceOf(CachingResourceTransformer.class));
assertThat(transformers.get(1), Matchers.equalTo(mockTransformer));
Mockito.verify(mockTransformer).setResourceUrlProvider(resourceUrlProvider);
}
@Test

View File

@@ -60,6 +60,7 @@ import org.springframework.web.method.HandlerTypePredicate;
import org.springframework.web.reactive.accept.RequestedContentTypeResolver;
import org.springframework.web.reactive.handler.AbstractUrlHandlerMapping;
import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping;
import org.springframework.web.reactive.resource.ResourceUrlProvider;
import org.springframework.web.reactive.result.method.RequestMappingInfo;
import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping;
@@ -285,6 +286,15 @@ public class WebFluxConfigurationSupportTests {
assertNotNull(webHandler);
}
@Test
public void resourceUrlProvider() throws Exception {
ApplicationContext context = loadConfig(WebFluxConfig.class);
String name = "resourceUrlProvider";
ResourceUrlProvider resourceUrlProvider = context.getBean(name, ResourceUrlProvider.class);
assertNotNull(resourceUrlProvider);
}
private void assertHasMessageReader(List<HttpMessageReader<?>> readers, ResolvableType type, MediaType mediaType) {
assertTrue(readers.stream().anyMatch(c -> mediaType == null || c.canRead(type, mediaType)));