Reactor 中的过滤和默认值
Filtering and default value in Reactor
我目前遇到了一个非常奇怪且令人沮丧的问题。
我有一些正在测试的代码,它们通过包含一系列过滤操作的反应式调用链运行。
当测试运行代码并且 'false' 值被 returned 时,代码仍然传递到链中的下一个调用,而不仅仅是 returning。
因为我仍然是 'reactive newbie',所以我想我可能没有在反应式代码链中做错什么。
代码如下:
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;
}
所以目前我只是将它硬编码为 return 'false',但是当我使用调试器逐步完成测试时,执行就好像 'true'正在 returned,所以我真的不知道是什么导致了这种行为。
一如既往,我们将不胜感激任何帮助!
如果你想让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);
我目前遇到了一个非常奇怪且令人沮丧的问题。 我有一些正在测试的代码,它们通过包含一系列过滤操作的反应式调用链运行。
当测试运行代码并且 'false' 值被 returned 时,代码仍然传递到链中的下一个调用,而不仅仅是 returning。
因为我仍然是 'reactive newbie',所以我想我可能没有在反应式代码链中做错什么。
代码如下:
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;
}
所以目前我只是将它硬编码为 return 'false',但是当我使用调试器逐步完成测试时,执行就好像 'true'正在 returned,所以我真的不知道是什么导致了这种行为。
一如既往,我们将不胜感激任何帮助!
如果你想让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);