Spring反应-如何在调用方法中处理mono.error

时间:2019-02-07 04:20:38

标签: spring exception-handling mono spring-webflux reactive

我是弹簧数据响应Cassandra的新手。在我的服务类中,我注入了ReactiveCassandraRepository的实现,如果通过给定的id找到它,它将返回我的pojo的Mono。

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());
        }
}

当存储库找到给定ID的记录时,上述代码可以正常工作。但是,如果找不到记录,那么我不确定会发生什么。我没有任何日志返回任何异常。

上述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 :(得分:0)

好像您的存储库找不到任何记录时返回空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));