Reactor中的筛选和默认值



我现在遇到了一个非常奇怪和令人沮丧的问题。我有一些正在测试的代码,它运行在包含一系列过滤操作的反应式调用链中。

当测试在代码中运行并返回"false"值时,代码仍然会传递到链中的下一个调用,而不仅仅是返回。

由于我还是一个"反应式新手",我想我可能没有在反应式代码链中做错误的事情。

这是代码:

private Mono<GetCardNumberServiceResponseData> updateCardNumberIfLastFourValidAndShaIsNull(Card card, GetCardNumberServiceResponseData responseData) {
return Mono.just(responseData)
.filter(response -> isValidLastFour(card, response))
.defaultIfEmpty(responseData)
.filter(response -> shaIsNull(card))
.defaultIfEmpty(responseData)
.flatMap(response -> updateCardNumber(card, response));
} 

这是没有正确评估的部分:

.filter(response -> isValidLastFour(card, response))

这就是"isValidLastFour"当前的样子:

private boolean isValidLastFour(Card card, GetCardNumberServiceResponseData responseData) {
//      String cardNumberFromResponse = responseData.getCardNumber();
//      String lastFourFromResponse =
//          cardNumberFromResponse.substring(cardNumberFromResponse.length() - 4);
//      return card.getLastFour().equals(lastFourFromResponse);
return false;
}

因此,目前我只是将其硬编码为返回"false",但当我使用调试器进行测试时,执行就好像返回了"true"一样,所以我真的不知道是什么导致了这种行为。

一如既往,我们非常感谢您的任何帮助!

如果您希望responseData是默认值,在有空Mono的情况下,您必须将defaultIfEmpty放在链的末尾:

return Mono.just(responseData)
.filter(response -> isValidLastFour(card, response))
.filter(response -> shaIsNull(card))
.flatMap(response -> updateCardNumber(card, response))
.defaultIfEmpty(responseData);

更好的是,你可以合并这些过滤器:

return Mono.just(responseData)
.filter(response -> isValidLastFour(card, response) && shaIsNull(card))
.flatMap(response -> updateCardNumber(card, response))
.defaultIfEmpty(responseData);

最新更新