java - 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));
有没有不复制代码的方法?谢谢
解决方案
我会将通用代码提取到一个单独的方法中:
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));
推荐阅读
- oauth-2.0 - 添加特定于给定资源服务器的声明或更确切地说是用户数据的正确方法?
- openstreetmap - 按点查找建筑物
- java - 为什么工具栏覆盖另一个活动的片段?
- c# - 基于用户的 ASP.NET Core 5 JwtBearer 动态密钥
- c# - 如何将项目添加到命名元组
- angular - 无法在 Teamcity 构建中使用业力运行单元测试。错误:“设置“PUPPETEER_SKIP_DOWNLOAD”环境变量以跳过下载。
- javascript - 插件开发人员在 Wordpress 中发送 AJAX 请求的最佳实践是什么
- entity-framework-core - 我的第二个上下文尝试进行第一个上下文所做的所有更改
- javascript - NextJs getStaticPaths 未呈现适当的页面,显示 404 错误
- java - 编写一个Java程序,将句子中每个单词的首字母大写