首页 > 解决方案 > Java Mapping Web Client POST 请求到不同的对象而不复制代码

问题描述

我有一个发布请求,我希望它将响应映射到调用它的 2 个 api 的不同对象。该请求总是返回 BookResponse。

在这里,我映射响应以返回书名:

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

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

标签: javapostwebclientcode-cleanup

解决方案


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

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

推荐阅读