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