Spring in Action Covers Spring 5-1--11 — страница 63 из 63

вместо необработанного объекта UserDetails.

В следующем примере объявляется, что bean-компонент ReactiveUserDetailsService использует внедренный UserRepository, который предположительно является реактивным Spring Data репозиторием (о котором мы поговорим подробнее в следующей главе):

@Service

public ReactiveUserDetailsService userDetailsService(

      UserRepository userRepo) {

   return new ReactiveUserDetailsService() {

      @Override

      public Mono findByUsername(String username) {

         return userRepo.findByUsername(username)

            .map(user -> {

          return user.toUserDetails();

            });

      }

   };

}

Здесь Mono возвращается по мере необходимости, но метод UserRepository.findByUsername() возвращает Mono. Поскольку это Mono, вы можете вызвать операции, такие как map(), чтобы преобразовать Mono в Mono.

В этом случае операция map() применяется с лямбда-выражением, которое вызывает вспомогательный метод toUserDetails() для объекта User, опубликованного Mono. Это преобразует User в UserDetails. Как следствие, операция .map() возвращает Mono, который является именно тем, что требуется для ReactiveUserDetailsService.findByUsername().

ИТОГО:

- Spring WebFlux предлагает реактивный веб-фреймворк, модель программирования которого соответствует модели Spring MVC, даже разделяя многие из тех же самых аннотаций.

- Spring 5 также предлагает функциональную модель программирования в качестве альтернативы Spring WebFlux.

- Реактивные контроллеры можно протестировать с помощью WebTestClient.

- На стороне клиента Spring 5 предлагает WebClient, реактивный аналог Spring RestTemplate.

- Хотя WebFlux имеет некоторые существенные изменения для базовых механизмов защиты веб-приложений, Spring Security 5 поддерживает реактивную безопасность с помощью модели программирования, которая не сильно отличается от нереактивных приложений Spring MVC.