2016-05-12 70 views
3

我正在试图理解反应堆和重构返回了Optional<CompanyDetails>使用反应堆的Mono<CompanyDetails>而不是服务方法消耗单 在Spring网络控制器

public Mono<CompanyDetails> findOne(String id) { 
    CompanyDetails result = retrieveFromSomewhere(id); 
    return Mono.justOrEmpty(result); 
} 

从我的理解这应该发出要么empty()just(result)。 我使用该服务在Spring的网络控制器这样的:

@RequestMapping(value = "{id}", method = RequestMethod.GET) 
public DeferredResult<CompanyDetails> getCompany(@PathVariable String id) { 
    final DeferredResult<CompanyDetails> result = new DeferredResult<>(); 
    companyService.findOne(id) 
      .consume(result::setResult); 
    return result; 
} 

如果结果发现这工作得很好,但如果findOne发出empty()它运行到超时。我可以明确地打电话get(),并检查null,但感觉完全错误。

另外:在重构之前,如果找不到结果,getCompany会抛出NotFoundException,这是可能的,还是我完全在错误的轨道上?

回答

2

我自己找到答案:第一个事实证明,反应堆的Mono有一个toCompletableFuture-方法,Spring MVC也可以使用它而不是DeferredResult。正如预期那样,CompletableFuture未能引发异常。

失败,Mono已发出error,而不是empty

public Mono<CompanyDetails> findOne(String id) { 
    CompanyDetails result = retrieveFromSomewhere(id); 
    return Mono 
      .justOrEmpty(result) 
      .otherwiseIfEmpty(Mono.error(...)); 
} 

@RequestMapping(value = "{id}", method = RequestMethod.GET) 
public CompletableFuture<CompanyDetails> getCompany(@PathVariable String id) { 
    return companyService.findOne(id) 
      .toCompletableFuture(); 
} 

现在好多了。