Saya memiliki titik akhir server ini menggunakan spring-webflux dan saya ingin mengembalikan ServerResponse.badRequest() ketika serverRequest menerima parameter yang salah. Permintaan curl -s "http://localhost:8080/4?a=5&b=3"; echo misalnya, berisi parameter yang tepat. Tetapi permintaan curl -s "http://localhost:8080/one?a=5&b=3"; echo berisi string, bukan Integer. Kemudian konversi new BidRequest(Integer.parseInt(tuple2.getT1()), tuple2.getT2().toSingleValueMap()) akan menimbulkan kesalahan.

Saya melakukan .onErrorReturn(new BidRequest(0, null)) tetapi sekarang saya ingin menerapkan beberapa operasi yang mengembalikan ServerResponse.badRequest(). Jadi saya menambahkan pada akhirnya .onErrorResume(error -> ServerResponse.badRequest().build()) pada akhirnya, tetapi tidak berfungsi. Saya juga menambahkan di tempat kode .onErrorReturn() dan tidak dikompilasi.

public Mono<ServerResponse> bidRequest(ServerRequest serverRequest) {
    var adId = serverRequest.pathVariable("id");
    var attributes = serverRequest.queryParams();
    log.info("received bid request with adID: {} attributes: {}", adId, attributes);

    return Mono.just(Tuples.of(adId, attributes))
        .map(tuple2 -> new BidRequest(Integer.parseInt(tuple2.getT1()), tuple2.getT2().toSingleValueMap()))
        // I WANT TO REPLACE IT FOR A BAD REQUEST
        // .onErrorReturn(new BidRequest(0, null))
        .flatMap(bidRequest -> {
            return Flux.fromStream(bidderService.bidResponseStream(bidRequest))
                    .flatMap(this::gatherResponses)
                    .reduce((bidResp1, bidResp2) -> {
                        if (bidResp1.getBid() > bidResp2.getBid()) return bidResp1;
                        else return bidResp2;
                    });
        })
        .map(bid -> {
            var price = bid.getContent().replace("$price$", bid.getBid().toString());
            bid.setContent(price);
            return bid;
        })
        .flatMap(winner -> {
            return ServerResponse.ok()
                    .contentType(MediaType.APPLICATION_JSON)
                    .body(BodyInserters.fromValue(winner.getContent()));
        })
        .switchIfEmpty(ServerResponse.notFound().build())
        // THIS DOES NOT RETURN ANY BAD REQUEST
        .onErrorResume(error -> ServerResponse.badRequest().build());
}
0
Felipe 5 Mei 2021, 20:24

1 menjawab

Jawaban Terbaik

Saya memecahkan berdasarkan jawaban ini menggunakan flatmap dan mengembalikan Mono.just() atau Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST));.

return Mono
        .just(Tuples.of(adId, attributes))
        .flatMap(tuple2 -> {
            if (validate(tuple2)) {
                log.info("request parameters valid: {}", tuple2);
                return Mono.just(new BidRequest(Integer.parseInt(tuple2.getT1()), tuple2.getT2().toSingleValueMap()));
            } else {
                log.error("request parameters invalid: {}", tuple2);
                return Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST));
            }
        })
        .flatMap(....
private boolean validate(Tuple2<String, MultiValueMap<String, String>> tuple2) {
    return GenericValidator.isInteger(tuple2.getT1());
}
1
Felipe 6 Mei 2021, 07:49