Управление работой реактора для определенных случаев использования (или получение ответа в определенный момент) - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь обновить документ в MongoDB, но не могу проверить обновленный статус и ответить пользователю. Ниже приведен мой код:

@Autowired
ReactiveMongoTemplate mongoTemplate;

public Mono<String> updateUser(UserIn userIn) {
   UserResponse resp = new UserResponse();
   mongoTemplate.findAndModify(query, update, User.class)
        //.doOnSuccess(bsItem -> {
        .flatMap(user -> {
            if(user.getItemId().equals(userIn.getId("_id")))
                resp.setStatus("Updated");
            else
                resp.setStatus("Failed");
            return Mono.just(resp);
   }).subscribe();

return Mono.just(resp.getStatus());
}

Несмотря на то, что обновление происходит в mongodb, он возвращает NPE при возврате. Как получить контроль после того, как оператор реактора выполнен здесь?

1 Ответ

0 голосов
/ 17 октября 2019

Вы почти никогда не должны подписываться в своем собственном приложении.

Абонент - это клиент, который инициировал вызов, в данном случае это, вероятно, веб-приложение. Ваше приложение просто передает данные, поэтому ваше приложение является издателем, что означает, что вы не должны подписываться. Веб-приложение подписывается.

Попробуйте это.

@Autowired
ReactiveMongoTemplate mongoTemplate;

public Mono<String> updateUser(UserIn userIn) {
    return mongoTemplate.findAndModify(query, update, User.class)
        .flatMap(user -> {
            final UserResponse resp = new UserResponse();
            if(user.getItemId().equals(userIn.getId("_id")))
                resp.setStatus("Updated");
            else
                resp.setStatus("Failed");
            return Mono.just(resp.getStatus());
   });
}

Моно не похоже на поток, вы выбираете, отображаете и возвращаете, все в одном моно, как цепочка событий. Цепочка событий.

...