diff --git a/spring-5/pom.xml b/spring-5/pom.xml
index 59bead4b73..6c52e6c8cc 100644
--- a/spring-5/pom.xml
+++ b/spring-5/pom.xml
@@ -40,13 +40,6 @@
spring-boot-starter-webflux
-
-
- io.projectreactor
- reactor-core
- 3.0.6.BUILD-SNAPSHOT
-
-
org.apache.commons
diff --git a/spring-5/src/main/java/com/baeldung/functional/RootServlet.java b/spring-5/src/main/java/com/baeldung/functional/RootServlet.java
new file mode 100644
index 0000000000..457206221b
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/functional/RootServlet.java
@@ -0,0 +1,87 @@
+package com.baeldung.functional;
+
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.http.server.reactive.HttpHandler;
+import org.springframework.http.server.reactive.ServletHttpHandlerAdapter;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.reactive.function.server.RouterFunction;
+import org.springframework.web.reactive.function.server.RouterFunctions;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.springframework.web.reactive.function.BodyExtractors.toDataBuffers;
+import static org.springframework.web.reactive.function.BodyExtractors.toFormData;
+import static org.springframework.web.reactive.function.BodyInserters.fromObject;
+import static org.springframework.web.reactive.function.server.RequestPredicates.*;
+import static org.springframework.web.reactive.function.server.RouterFunctions.route;
+import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler;
+import static org.springframework.web.reactive.function.server.ServerResponse.ok;
+
+public class RootServlet extends ServletHttpHandlerAdapter {
+
+ public RootServlet() {
+ this(WebHttpHandlerBuilder
+ .webHandler(toHttpHandler(routingFunction()))
+ .prependFilter(new IndexRewriteFilter())
+ .build());
+ }
+
+ private RootServlet(HttpHandler httpHandler) {
+ super(httpHandler);
+ }
+
+ private static final Actor BRAD_PITT = new Actor("Brad", "Pitt");
+ private static final Actor TOM_HANKS = new Actor("Tom", "Hanks");
+ private static final List actors = new CopyOnWriteArrayList<>(Arrays.asList(BRAD_PITT, TOM_HANKS));
+
+ private static RouterFunction> routingFunction() {
+
+ return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld")))
+ .andRoute(POST("/login"), serverRequest -> serverRequest
+ .body(toFormData())
+ .map(MultiValueMap::toSingleValueMap)
+ .map(formData -> {
+ System.out.println("form data: " + formData.toString());
+ if ("baeldung".equals(formData.get("user")) && "you_know_what_to_do".equals(formData.get("token"))) {
+ return ok()
+ .body(Mono.just("welcome back!"), String.class)
+ .block();
+ }
+ return ServerResponse
+ .badRequest()
+ .build()
+ .block();
+ }))
+ .andRoute(POST("/upload"), serverRequest -> serverRequest
+ .body(toDataBuffers())
+ .collectList()
+ .map(dataBuffers -> {
+ AtomicLong atomicLong = new AtomicLong(0);
+ dataBuffers.forEach(d -> atomicLong.addAndGet(d
+ .asByteBuffer()
+ .array().length));
+ System.out.println("data length:" + atomicLong.get());
+ return ok()
+ .body(fromObject(atomicLong.toString()))
+ .block();
+ }))
+ .and(RouterFunctions.resources("/files/**", new ClassPathResource("files/")))
+ .andNest(path("/actor"), route(GET("/"), serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), serverRequest -> serverRequest
+ .bodyToMono(Actor.class)
+ .doOnNext(actors::add)
+ .then(ok().build())))
+ .filter((request, next) -> {
+ System.out.println("Before handler invocation: " + request.path());
+ return next.handle(request);
+ });
+
+ }
+
+}
diff --git a/spring-5/src/main/java/com/baeldung/web/FooController.java b/spring-5/src/main/java/com/baeldung/web/FooController.java
index de6928033e..d0b69e707e 100644
--- a/spring-5/src/main/java/com/baeldung/web/FooController.java
+++ b/spring-5/src/main/java/com/baeldung/web/FooController.java
@@ -1,6 +1,7 @@
package com.baeldung.web;
import java.util.List;
+import java.util.Optional;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
@@ -33,7 +34,7 @@ public class FooController {
@ResponseBody
@Validated
public Foo findById(@PathVariable @Min(0) final long id) {
- return repo.findOne(id);
+ return repo.findOne(id).orElse(null);
}
@RequestMapping(method = RequestMethod.GET)
diff --git a/spring-5/src/main/webapp/WEB-INF/web.xml b/spring-5/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..bfcf43dad2
--- /dev/null
+++ b/spring-5/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,21 @@
+
+
+
+ Spring Functional Application
+
+
+ functional
+ com.baeldung.functional.RootServlet
+ 1
+ true
+
+
+ functional
+ /
+
+
+
+
\ No newline at end of file