Ваш метод создания хотел бы выглядеть примерно так, и вы хотели бы вернуть Mono<Product>
из вашего контроллера, а не только объект.
public Mono<Product> createProduct(Product product) {
return repository.findByProductId(product.getProductId())
.switchIfEmpty(Mono.just(mapper.apiToEntity(product)))
.flatMap(repository::save)
.map(mapper::entityToApi);
}
Как прокомментировал @Thomas, вы нарушаете некоторые из основы реактивного кодирования и невозможность получения преимуществ от использования block (), и следует прочитать об этом подробнее. Например, реактивный репозиторий mon go, который вы используете, будет возвращать Mono, который имеет свои собственные методы для обработки, если он пуст, без необходимости использования Optional, как показано выше.
EDIT для сопоставления с ошибкой, если объект уже существует, в противном случае сохранить
public Mono<Product> createProduct(Product product) {
return repository.findByProductId(product.getProductId())
.hasElement()
.filter(exists -> exists)
.flatMap(exists -> Mono.error(new Exception("my exception")))
.then(Mono.just(mapper.apiToEntity(product)))
.flatMap(repository::save)
.map(mapper::entityToApi);
}