簡體   English   中英

如何返回包含 Reactive Mono 和 Flux 的 Reactive Flux?

[英]How to return a Reactive Flux that contains a Reactive Mono and Flux?

我是響應式編程的新手,遇到了這個問題:

[
    {
        "customerDTO": {
            "scanAvailable": true
        },
        "bankAccountDTOs": {
            "scanAvailable": true,
            "prefetch": -1
        }
    }
]

DTO:

public class ResponseClientDTO {
    private Mono<CustomerDTO> customerDTO;
    private Flux<BankAccountDTO> bankAccountDTOs;
}

服務:

public Flux<ResponseClientDTO> getCustomerWithBankAccounts(String customerId){
    Flux<BankAccountDTO> bankAccounts = webClient
        .get()
        .uri(uriBuilder -> 
                uriBuilder.path("customers")
                .queryParam("customerId", customerId).build())
        .accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .bodyToFlux(BankAccountDTO.class);
        
    
    Mono<CustomerDTO> cMono = findOne(customerId);
    
    ResponseClientDTO responseClientDTO = new ResponseClientDTO();
    responseClientDTO.setBankAccountDTOs(bankAccounts);
    responseClientDTO.setCustomerDTO(cMono);
    
    return Flux.just(responseClientDTO);
}

我從另一個 API 查詢一個端點,它返回一個Flux<BankAccounts> 我想得到客戶的所有銀行賬戶。

這不是您在反應式堆棧中想要的。 首先,更改您的 DTO,使其不包含MonoFlux ,而是包含CustomerDTOList<BankAccountDTO>

public class ResponseClientDTO {
    private CustomerDTO customerDTO;
    private List<BankAccountDTO> bankAccountDTOs;
}

然后,您需要重新安排方法以返回Mono<ResponseClientDTO>並更改處理FluxMono的邏輯:

public Mono<ResponseClientDTO> getCustomerWithBankAccounts(String customerId){
    Flux<BankAccountDTO> bankAccounts = webClient
        .get()
        .uri(uriBuilder -> 
                uriBuilder.path("customers")
                .queryParam("customerId", customerId).build())
        .accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .bodyToFlux(BankAccountDTO.class);
        
    Mono<CustomerDTO> cMono = findOne(customerId);
    
    return bankAccounts.collectList().zipWith(cMono).map(data -> {
        ResponseClientDTO responseClientDTO = new ResponseClientDTO();
        responseClientDTO.setBankAccountDTOs(data.getT1());
        responseClientDTO.setCustomerDTO(data.getT2());
    })
}

(很抱歉有任何 Java 錯字,但此時我已經習慣了 Kotlin)。

考慮查看以下有用的在線資源:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM