ну, во-первых, у вас есть 2 addAccount, что может немного сбить с толку.
Во-вторых, о каком «хранилище» вы пишете?если это репозиторий sql, вам нужно правильно обернуть его в Mono.fromCallable()
, иначе он заблокирует пул потоков Reactive
и у вас может быть действительно плохая производительность.
Да, есть другие способы сделать что-то.Многие люди склонны делать что-то в flatmap
или map
и уверены, что здесь вполне можно сделать что-то, но для семантики я бы сказал, что это менее хорошо.
map
и flatmap
обычно используются для выполнения каких-либо вычислений внутреннего значения моно, а затем возвращают то же или новое значение и / или тип внутри моно.
я бы переписалвот так вот.
здесь возвращено значение void:
public void addAccount(Account account) {
Account proxy;
// make sure that accountId is set to support auto-generation of synthetic key value
proxy = new Account(-1, account.getShortName(), account.getLongName(), account.getDescription());
accounts.save(proxy);
}
И здесь:
public Mono<ServerResponse> addAccount(ServerRequest request) {
return request.bodyToMono(Account.class)
.doOnSuccess(account -> {
accountService.addAccount(account);
}).then(ServerResponse.ok().build())
.switchIfEmpty(ServerResponse.badRequest()
.contentType(APPLICATION_JSON)
.build());
}
существует ряд различных doOn
методов, которые должны бытьпривыкли потреблять и делать «побочные эффекты» на вещи.Как doOnSuccess
, doOnError
, doOnCancel
и т. Д. И т. Д.
у вас также есть then
и thenReturn
, которые просто вернут все, что вы в них положили.Then
возвращает то, что Mono
вы положили в него.thenReturn
упаковывает любое значение, которое вы положили в него, в Mono
и возвращает его.