Browse Source

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
pull/1819/head
Arjen Poutsma 7 years ago
parent
commit
bfb2effddb
  1. 25
      spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RouterFunctions.java
  2. 36
      spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PathResourceLookupFunctionTests.java

25
spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RouterFunctions.java

@ -123,14 +123,35 @@ public abstract class RouterFunctions { @@ -123,14 +123,35 @@ public abstract class RouterFunctions {
* For instance
* <pre class="code">
* Resource location = new FileSystemResource("public-resources/");
* RoutingFunction&lt;ServerResponse&gt; resources = RouterFunctions.resources("/resources/**", location);
* RouterFunction&lt;ServerResponse&gt; resources = RouterFunctions.resources("/resources/**", location);
* </pre>
* @param pattern the pattern to match
* @param location the location directory relative to which resources should be resolved
* @return a router function that routes to resources
* @see #resourceLookupFunction(String, Resource)
*/
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&lt;Resource&gt; defaultResource = Mono.just(new ClassPathResource("index.html"));
* Function&lt;ServerRequest, Mono&lt;Resource&gt;&gt; lookupFunction =
* RouterFunctions.resourceLookupFunction("/resources/**", new FileSystemResource("public-resources/"))
* .andThen(resourceMono -&gt; resourceMono.switchIfEmpty(defaultResource));
*
* RouterFunction&lt;ServerResponse&gt; 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);
}
/**

36
spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PathResourceLookupFunctionTests.java

@ -1,5 +1,5 @@ @@ -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");
* you may not use this file except in compliance with the License.
@ -19,6 +19,7 @@ package org.springframework.web.reactive.function.server; @@ -19,6 +19,7 @@ package org.springframework.web.reactive.function.server;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.function.Function;
import org.junit.Test;
import reactor.core.publisher.Mono;
@ -95,4 +96,37 @@ public class PathResourceLookupFunctionTests { @@ -95,4 +96,37 @@ public class PathResourceLookupFunctionTests {
.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();
}
}
Loading…
Cancel
Save