Wraz ze Spring Boot 2 w wersji 2.2.0 pojawiła się nowa funkcjonalność: WebMvc.fn. Jest to implementacja funkcyjnego podejścia do definiowania endpointów, podobnie jak ma to miejsce przy wykorzystaniu Spring WebFlux. O tym, jak to rozwiązanie działa w WebFlux, można było przeczytać w jednym z naszych artykułów: #1 Spring Boot 2 – Router functions. Dziś sprawdzimy, jak to funkcyjne podejście sprawdza się w klasycznym stosie MVC.
WebMvc.fn
Jak pisałem we wstępie, w nowym Spring Boot 2 możemy tworzyć naszą część serwerową na dwa sposoby (można je mieszać w jednej aplikacji):
Podejście klasyczne – korzystając z adnotacji @Controller i innych związanych z Webem.
Podejście funkcyjne – korzystając z WebMvc.fn.
Zależności
Ponieważ wsparcie dla funkcyjnego podejścia pojawiło się w kontekście stosu MVC, wystarczy, że w naszym projekcie dodamy standardowy moduł Web:
W wyniku naszej lambdy otrzymujemy obiekt typu ServerRequest, z którego możemy odczytać wiele informacji:
cookies() - dostęp do ciasteczek.
headers() - dostęp do nagłówków.
sessions() - dostęp do sesji.
pathVariable(name) - dostęp do zmiennej ze ścieżki.
servletRequest() - dostęp do obiektu typu HttpServletRequest, z którego można pobrać wszystkie informacje.
Handler
Jeśli chcemy oddzielić konfigurację routingu od logiki, możemy przygotować klasę zawierającą wszystkie handlery. Metody HTTP przyjmują obiekt typu HandlerFunction<ServerResponse>: