Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 WebFlux начало работы  [new]
-=Koba=-
Member

Откуда: Минск
Сообщений: 1968
Разбираюсь с WebFlux возникли трудности когда надо обрабатывать различные условия.
Подскажите направление, правильно ли делаю

1) Проверка на существование. Вообще случае existsByEmail можно заменить на findByEmail но меня интересует работа с Mono<Boolean> Правильно ли сделана логика. Проверка email в БД, если такого email нет, создаем default admin
  @Override
  public void afterPropertiesSet() throws Exception {
    log.info("AppInitializator initialization logic ...");
    userService.existsByEmail(ADMIN_EMAIL)
        .filter(exist -> !exist)
        .map(exist -> createAdmin())
        .flatMap(admin -> userService.save(admin))
        .subscribe(user -> log.info("Create default admin [admin: {}]", user)); --данный вызов, чтоб выполнился один раз при старте Spring Boot
  }


2) Как правильно работать с различными Mono в головном. Мне приходит refreshToken - Начинаю парсить его и проверять дату окончания срока (библиотека Nimbus JOSEl) в конце у меня объект SignedJWT. Но далее для работы мне опять нужен токен, чтоб найти его в БД и обновить
 @Override
  public Mono<SignInResponse> refreshToken(RefreshTokenRequest refreshTokenRequest) {
    return Mono.just(refreshTokenRequest.getRefreshToken())
        .doOnNext(token -> {
          SignedJWT signedJwt = jwtTokenService.checkToken(JwtTokenEnum.JWT_REFRESH_TOKEN, token);
          jwtTokenService.checkExpiration(signedJwt);
-- удалить запись из коллекции (refreshTokenRepository.deleteByToken(token)
        })
        .flatMap(token -> refreshTokenRepository.findRefreshTokenEntityByRefreshToken(token))
        .filter(Objects::nonNull)
        .flatMap(refreshTokenEntity -> userService.findById(refreshTokenEntity.getId()))
-- удалить запись из коллекции
-- удалить запись из коллекции (refreshTokenRepository.deleteByToken(token)
        .flatMap(this::generateTokens);
  }
1 мар 20, 18:04    [22090150]     Ответить | Цитировать Сообщить модератору
 Re: WebFlux начало работы  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3531
-=Koba=-,

что-то вы странное делаете:
- писать в базу в afterPropertiesSet() - это так себе затея, тут в лиснере ловить ContextStartedEvent куда лучше
- делать обновление токенов асинхронным - это чет тоже так себе затея, у вас же клиент без обновленного токена работать нормально не может, а вы достаточно короткую операцию хотите запихнуть в общую очередь обработки
1 мар 20, 18:43    [22090166]     Ответить | Цитировать Сообщить модератору
 Re: WebFlux начало работы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
-=Koba=-,
Мне тоже кажется, что работа с аутентификацией делается Синхронно.
Значит WebFlux идет лесом.
1 мар 20, 20:57    [22090213]     Ответить | Цитировать Сообщить модератору
 Re: WebFlux начало работы  [new]
-=Koba=-
Member

Откуда: Минск
Сообщений: 1968
У меня еще даже проблема не в коде
А не могли б подробно объяснить нюанс с токеном и асинхроностью
2 мар 20, 08:26    [22090362]     Ответить | Цитировать Сообщить модератору
 Re: WebFlux начало работы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
-=Koba=-,
Твой код из головы или на основе примера? Ссылка?
2 мар 20, 11:02    [22090452]     Ответить | Цитировать Сообщить модератору
 Re: WebFlux начало работы  [new]
-=Koba=-
Member

Откуда: Минск
Сообщений: 1968
Это мой код.. Просто есть вопросы

Как работь с if else then
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
      log.info("ContextRefreshedEvent Initialization logic ...");
      userService.findByEmail(ADMIN_EMAIL)
          .switchIfEmpty(Mono.just(createAdmin()))
          .flatMap(admin -> userService.save(admin))
          .subscribe(user -> log.info("Create default admin [admin: {}]", user));
    }

  @Override
  public void afterPropertiesSet() throws Exception {
    log.info("AppInitializator initialization logic ...");
    userService.existsByEmail(ADMIN_EMAIL)
        .filter(exist -> !exist)
        .map(exist -> createAdmin())
        .flatMap(admin -> userService.save(admin))
        .subscribe(user -> log.info("Create default admin [admin: {}]", user)); --данный вызов, чтоб выполнился один раз при старте Spring Boot
  }


Если пользователь найден ничего не делать, если не найден создать нового
В первом примере Mono<Boolean> - findByEmai
Во втором примере Mono<User> - findById

То есть если какое-то условие не срабатывает просто выйти, а не гнать всю цепочку до конца
3 мар 20, 11:14    [22091391]     Ответить | Цитировать Сообщить модератору
 Re: WebFlux начало работы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
-=Koba=-
Как работь с if else then
никак.
Реактивное программирование для Потока данных распределенных во времени.
Понятно?
Нет потока - нет реакивному программированию.
3 мар 20, 11:41    [22091427]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить