spring - Spring Reactive 在将对象返回给客户端之前对其进行操作
问题描述
我必须调用一个返回此 JSON 输出的 URL
{
"zonesList": [
"zone1",
"zone2",
"zone5",
"zone4"
]
}
我的目标是返回一个带有布尔值的 POJO,例如
zone1: true Zone2: true zone3: false (因为 zone3 不在输出中)
我像这样创建了 2 个 pojo
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ZonesList {
public ZoneActiveContentResponseModel zonesList;
}
和
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ZoneActiveContentResponseModel {
public Boolean zone1 = false;
public Boolean zone2 = false;
public Boolean zone3 = false;
public Boolean zone4 = false;
public Boolean zone5 = false;
}
我想退货 Mono 但我不知道如何退货,这就是我现在拥有的
Mono<ZonesList> zoneList = webClient
.get()
.uri(apiPath)
.accept(MediaType.APPLICATION_JSON)
.retrieve().bodyToMono(ZonesList.class)
.onErrorResume(throwable -> {
log.error("Received error response from GET zone fragment Api [{}]", throwable);
ZoneActiveContentResponseModel errorModel = new ZoneActiveContentResponseModel();
// errorModel.setErrors(prepareErrorObject(throwable));
// return Mono.just(errorModel);
return null;
});
所以我的问题是如何操作来自 webclient 的输出并返回一个新对象?
解决方案
首先你有这个回应
{
"zonesList": [
"zone1",
"zone2",
"zone5",
"zone4"
]
}
所以这可以映射到杰克逊的以下自定义对象中
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class ZonesList {
private List<String> zonesList;
}
然后,您可以使用这个将其映射到您实际想要返回的另一个对象。你定义的那个
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ZoneActiveContentResponseModel {
public Boolean zone1 = false;
public Boolean zone2 = false;
public Boolean zone3 = false;
public Boolean zone4 = false;
public Boolean zone5 = false;
}
然后,您使用.map
将收到的响应转换为您想要从控制器返回的响应
Mono<ZonesList> zoneList = webClient
.get()
.uri(apiPath)
.accept(MediaType.APPLICATION_JSON)
.retrieve().bodyToMono(ZonesList.class)
.map (el ->
new ZoneActiveContentResponseModel( el.getZonesList.contains("zone1"),
el.getZonesList.contains("zone2"),
el.getZonesList.contains("zone3"),
el.getZonesList.contains("zone4"),
el.getZonesList.contains("zone5")) )
.onErrorResume(throwable -> {
log.error("Received error response from GET zone fragment Api [{}]", throwable);
ZoneActiveContentResponseModel errorModel = new ZoneActiveContentResponseModel();
// errorModel.setErrors(prepareErrorObject(throwable));
// return Mono.just(errorModel);
return null;
});
推荐阅读
- python - 使用正则表达式通过带前缀的逗号分隔字符串
- reactjs - Chakra-ui 在 Firefox 上忽略 FontWeight
- mongodb - 羽毛猫鼬:Mongo-DB 事务 - ReferenceError:何时未定义
- azure - Powershell 格式表表达式不允许划分 PsCustomObject 成员
- python - 是否可以在 matplotlib(python)中的数据之上绘制轮廓?
- javascript - DynamoDB PutCommand V3 - 返回项目
- android-studio - 如何在“5”秒后删除/隐藏 RecyclerView 中的项目?
- php - 如果是用户第一次购买,如何进行固定折扣
- python - 如何调整文本大小以完全适合 WxPython 中的网格单元格?我在获取属性时遇到问题
- spring-boot - 在 hello world 应用程序中使用 docker CMD 而不是 application.properties