Spring реактивный - как обработать mono.error в вызывающем методе - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в весенних данных реактивной Кассандры.В моем классе обслуживания я внедряю реализацию ReactiveCassandraRepository, которая возвращает Mono моего pojo, если находит его по заданному идентификатору.

public Mono<MyPojo> getResult(String id) {
      return myRepository.findById(id)
        .flatMap(result -> result!=null ?  getDecision(result) :
                Mono.error(new Exception("result not found for id: "+id)));

}

private Mono<? extends MyPojo> getDecision(MyPojoDto result) {
        if(result.getRecommendation()==0) {
            return Mono.just(MyPojo.builder().result("Accept").build());
        }
        else
        {
            return Mono.just(MyPojo.builder().result("Reject").build());
        }
}

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

Вышеуказанный метод getResult вызывается моим Spring-контроллером.Но я не уверен, как справиться с этим в моем контроллере, чтобы я мог отправить соответствующий ответ своим потребителям.

Ниже приведен код моего контроллера.

@RequestMapping(value = “/check/order/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Mono<ResponseEntity<MyPojo>> getResult(
        @PathVariable(“id") id id) {

    return myService.getResult(id)
            .flatMap(result -> result!=null ?
                    getCustomResponse(id, result,HttpStatus.OK) :
                    getCustomResponse(id,result, HttpStatus.INTERNAL_SERVER_ERROR));
}

Как мы справляемся с Mono.error () в вызывающем методе.

С уважением,

Vinoth

1 Ответ

0 голосов
/ 07 февраля 2019

Похоже, что ваш репозиторий возвращает пустой Mono, когда он не может найти какую-либо запись.

Вы можете изменить свой getResult метод:

return myRepository.findById(id)
        .flatMap(result -> getDecision(result))
        .switchIfEmpty(Mono.error(new Exception("result not found for id: " + id)));

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

return myService.getResult(id)
        .flatMap(result -> getCustomResponse(id, result, HttpStatus.OK))
        .switchIfEmpty(getCustomResponse(id, result, HttpStatus.NOT_FOUND));
...