Expose resource lookup function
This commit exposes the resource lookup function used by `RouterFunctions.resources(String, Resource)`, so that it can be composed upon. Issue: SPR-16788
This commit is contained in:
@@ -123,14 +123,35 @@ public abstract class RouterFunctions {
|
|||||||
* For instance
|
* For instance
|
||||||
* <pre class="code">
|
* <pre class="code">
|
||||||
* Resource location = new FileSystemResource("public-resources/");
|
* Resource location = new FileSystemResource("public-resources/");
|
||||||
* RoutingFunction<ServerResponse> resources = RouterFunctions.resources("/resources/**", location);
|
* RouterFunction<ServerResponse> resources = RouterFunctions.resources("/resources/**", location);
|
||||||
* </pre>
|
* </pre>
|
||||||
* @param pattern the pattern to match
|
* @param pattern the pattern to match
|
||||||
* @param location the location directory relative to which resources should be resolved
|
* @param location the location directory relative to which resources should be resolved
|
||||||
* @return a router function that routes to resources
|
* @return a router function that routes to resources
|
||||||
|
* @see #resourceLookupFunction(String, Resource)
|
||||||
*/
|
*/
|
||||||
public static RouterFunction<ServerResponse> resources(String pattern, Resource location) {
|
public static RouterFunction<ServerResponse> resources(String pattern, Resource location) {
|
||||||
return resources(new PathResourceLookupFunction(pattern, location));
|
return resources(resourceLookupFunction(pattern, location));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the resource lookup function used by {@link #resources(String, Resource)}.
|
||||||
|
* The returned function can be {@linkplain Function#andThen(Function) composed} on, for
|
||||||
|
* instance to return a default resource when the lookup function does not match:
|
||||||
|
* <pre class="code">
|
||||||
|
* Mono<Resource> defaultResource = Mono.just(new ClassPathResource("index.html"));
|
||||||
|
* Function<ServerRequest, Mono<Resource>> lookupFunction =
|
||||||
|
* RouterFunctions.resourceLookupFunction("/resources/**", new FileSystemResource("public-resources/"))
|
||||||
|
* .andThen(resourceMono -> resourceMono.switchIfEmpty(defaultResource));
|
||||||
|
*
|
||||||
|
* RouterFunction<ServerResponse> resources = RouterFunctions.resources(lookupFunction);
|
||||||
|
* </pre>
|
||||||
|
* @param pattern the pattern to match
|
||||||
|
* @param location the location directory relative to which resources should be resolved
|
||||||
|
* @return the default resource lookup function for the given parameters.
|
||||||
|
*/
|
||||||
|
public static Function<ServerRequest, Mono<Resource>> resourceLookupFunction(String pattern, Resource location) {
|
||||||
|
return new PathResourceLookupFunction(pattern, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2018 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -19,6 +19,7 @@ package org.springframework.web.reactive.function.server;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
@@ -95,4 +96,37 @@ public class PathResourceLookupFunctionTests {
|
|||||||
.verify();
|
.verify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void composeResourceLookupFunction() throws Exception {
|
||||||
|
|
||||||
|
Function<ServerRequest, Mono<Resource>> lookupFunction =
|
||||||
|
new PathResourceLookupFunction("/resources/**",
|
||||||
|
new ClassPathResource("org/springframework/web/reactive/function/server/"));
|
||||||
|
|
||||||
|
ClassPathResource defaultResource = new ClassPathResource("response.txt", getClass());
|
||||||
|
|
||||||
|
Function<ServerRequest, Mono<Resource>> customLookupFunction =
|
||||||
|
lookupFunction.andThen(resourceMono -> resourceMono
|
||||||
|
.switchIfEmpty(Mono.just(defaultResource)));
|
||||||
|
|
||||||
|
MockServerRequest request = MockServerRequest.builder()
|
||||||
|
.uri(new URI("http://localhost/resources/foo"))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Mono<Resource> result = customLookupFunction.apply(request);
|
||||||
|
StepVerifier.create(result)
|
||||||
|
.expectNextMatches(resource -> {
|
||||||
|
try {
|
||||||
|
return defaultResource.getFile().equals(resource.getFile());
|
||||||
|
}
|
||||||
|
catch (IOException ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.expectComplete()
|
||||||
|
.verify();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user