Просто подумал о чем-то другом, что можно было бы сделать. Это очень отличается от моего первого ответа, поскольку он не использует регулярные выражения, поэтому я решил сделать второй ответ.
Используйте эквивалентный метод вашего языка выбора split()
в строке со словом отрицать как аргумент о том, на что разделить. Пример с использованием Python:
>>> text = 'barbarasdbarbar 1234egb ar bar32 sdfbaraadf'
>>> text.split('bar')
['', '', 'asd', '', ' 1234egb ar ', '32 sdf', 'aadf']
Приятно, как это сделать, по крайней мере, на Python (я не помню, была ли функциональность такой же, как, например, Visual Basic или Java) , заключается в том, что он позволяет вам опознать, когда «строка» повторялась в строке из-за того, что пустые строки между «барами» включаются в список результатов (хотя пустая строка в начале происходит из-за того, что существует «бар» в начале строки). Если вы этого не хотите, вы можете просто удалить пустые строки из списка.
Прежде всего, у вас есть логика для генерации токена, если токена нет. Например:
private Mono<String> getToken(String token) {
return Mono
.just(token)
.switchIfEmpty(Mono.just("some token"));
}
В этом случае немного излишне использовать switchIfEmpty
для этого, но я предполагаю, что ваш процесс генерации токена немного сложнее, иначе вы могли бы работать с [ 114] вместо (например, token.orElse("some token")
).
Кроме того, у нас также есть некоторая логика, чтобы либо найти пользователя по его токену, либо создать нового пользователя, если по данному токену нет пользователя:
private Mono<User> findUserByToken(String token) {
return userRepository
.findByToken(token)
.switchIfEmpty(userRepository.save(new User("John Doe", token)));
}
Теперь, когда у нас есть эти методы, мы можем создать PageView
и использовать эти методы по пути. Причина, по которой я начинаю с создания PageView
, заключается в том, что это первая «константа» во всем токене, независимо от того, найден ли токен / пользователь:
return Mono
.just(new PageView(uri))
.flatMap(pageViewRepository::save)
.flatMap(pageView -> getToken(token)
.flatMap(this::findUserByToken)
.doOnNext(user -> user.setFoo("foo"))
.doOnNext(user -> user.getPageView().add(pageView)))
.flatMap(userRepository::save)
.map(User::getToken);
Теперь, поскольку вам нужен токен добавить к ответу, и я понял, что токен как-то является частью объекта User
(иначе UserRepository.findByToken()
не сработает?), было бы проще просто использовать User::getToken
в конце, чтобы получить токен для передачи на ответ.
Имейте в виду, что шаблон репозитория правильно работает с Spring, но есть только реактивная поддержка для MongoDB, Cassandra, Couchbase и Redis. Кроме этого, есть также реактивная поддержка PostgreSQL через rdbc , но я не думаю, что данные Spring поддерживают это.