2016-05-12 61 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(); 
} 

現在好多了。