Проверка Spring Webflux Bean

У меня есть простой контроллер отдыха (использующий Spring web-FLUX), который получает bean-компонент для сохранения в базе данных. Но, как обычно, я хотел бы проверить некоторые поля перед сохранением.

У меня есть метод проверки, который нужно вызвать перед сохранением компонента. Но как я могу сделать это более функциональным (и подходящим) образом?

Я пробовал что-то вроде:

public void save(Mono<MyBean> myBean) {
    myBean.map(this::validateBean).map(myRepository::save)
}

Но метод validateBean не вызывается, только когда я делаю что-то вроде

public void save(Mono<MyBean> myBean) {
    myBean.map(this::validateBean)
          .map(myRepository::save)
          .subscribe();
}

Я не знаю, является ли часть subscribe наиболее правильной (я думаю, что это не так), но я думаю, что это работает, потому что это своего рода терминальная операция. Я прав?

Тем не менее, это не решает мою проблему, потому что мой метод проверки выдает BusinessException, когда с компонентом что-то не так. И это именно то, что я хочу сделать.

[ОТРЕДАКТИРОВАНО] Это мой контроллер отдыха, я бы хотел что-то вроде:

@PostMapping(value = "/something")
public Mono<ResponseEntity> salvar(@RequestBody MyBean myBean) {
    return myService.salvar(myBean)
            .map(RestResponses::ok)
            .defaultIfEmpty(RestResponses.empty());
}

Я знаю, что это не работает, потому что мой сервис ничего не возвращает. Но я не знаю, как будет правильно. Поэтому я просто публикую идею. Спасибо за понимание...

Не могли бы вы, ребята, помочь мне?


person Igor Veloso    schedule 02.06.2017    source источник
comment
Насколько я знаю, Mono является холодным издателем. Это означает, что у него должен быть хотя бы один подписчик, чтобы начать передачу данных.   -  person rvit34    schedule 03.06.2017
comment
Не могли бы вы показать свой фактический метод контроллера? Кроме того, суть этой проблемы, вероятно, заключается в том, что вы полагаетесь на методы блокировки, возвращающие void, а не на реактивный репозиторий, который должен возвращать Mono<Void> при сохранении данных. Обратите внимание, что подписка на издателя обычно пахнет.   -  person Brian Clozel    schedule 03.06.2017
comment
@rvit34, спасибо за ваш комментарий. Не могли бы вы дать мне ссылку на это, чтобы я мог понять это лучше?   -  person Igor Veloso    schedule 05.06.2017
comment
@BrianClozel, спасибо за ваш комментарий. Я отредактировал свой вопрос.   -  person Igor Veloso    schedule 05.06.2017
comment
см. ordina-jworks.github.io /реактив/2016/12/12/   -  person rvit34    schedule 05.06.2017
comment
ваш репозиторий также должен быть реактивным с подписью Mono<Void> save(MyBean myBean)   -  person Brian Clozel    schedule 06.06.2017
comment
Я также запутался в проверке при переключении на webflux, см. webflux-functional-applicat">здесь   -  person Hantsy    schedule 02.01.2018