Java 映射 Web 客户端 POST 请求到不同的对象而不复制代码

Java Mapping Web Client POST request to different objects without copy the code

我有一个 post 请求,我希望它将响应映射到调用它的 2 api 的不同对象。请求总是 return BookResponse.

这里我将响应映射到 return 书名:

public Mono<String> getBookName(BookRequest bookRequest) {
  return client
            .post()
            .uri("PATH")
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON_UTF8)
            .body(bookRequest))
            .retrieve()
            .bodyToMono(BookResponse.class)
            .doOnNext(this::validateResponseStatus)
            .map(BookResponse::getBookName)
            .doOnError(throwable -> logError(throwable));
 }

这里相同的调用只是将响应映射到包含图书作者 + 请求对象的其他对象:

 public Mono<BookObject> getBookName(BookRequest bookRequest) {
        return client
            .post()
            .uri("PATH")
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON_UTF8)
            .body(requestBody))
            .retrieve()
            .bodyToMono(BookResponse.class)
            .doOnNext(this::validateResponseStatus)
            .map(bookResponse -> new BookObject(bookResponse.getName(), bookRequest)
            .doOnError(throwable -> logError(throwable));

有没有不用复制代码的方法? 谢谢

我会将公共代码提取到一个单独的方法中:

public Something getSomething() {
  client
        .post()
        .uri("PATH")
        .contentType(MediaType.APPLICATION_JSON)
        .accept(MediaType.APPLICATION_JSON_UTF8)
        .body(requestBody))
        .retrieve()
        .bodyToMono(BookResponse.class)
        .doOnNext(this::validateResponseStatus)

}

然后,在您的方法中,您只需要执行如下操作:

Something something = getSomething();
return something.map(bookResponse -> new BookObject(bookResponse.getName(), bookRequest).doOnError(throwable -> logError(throwable));

Something something = getSomething();
return something.map(BookResponse::getBookName).doOnError(throwable -> logError(throwable));