Spring 在将对象返回给客户端之前响应式操作对象
Spring Reactive manipulating Object before returning it to Client
我必须调用一个 URL return 这个 JSON 输出
{
"zonesList": [
"zone1",
"zone2",
"zone5",
"zone4"
]
}
我的目标是 return 一个布尔值类似于
的 POJO
zone1:正确
区域 2:正确
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;
}
我想要 return Mono 但我不确定如何 return 它,这就是我现在拥有的
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 和 return 新对象的输出?
您收到此回复的第一件事
{
"zonesList": [
"zone1",
"zone2",
"zone5",
"zone4"
]
}
所以这可以映射到 Jackson 的以下自定义对象中
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class ZonesList {
private List<String> zonesList;
}
然后你可以用这个把它映射到你真正想要的另一个对象return。你定义的那个
@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;
});
我必须调用一个 URL return 这个 JSON 输出
{
"zonesList": [
"zone1",
"zone2",
"zone5",
"zone4"
]
}
我的目标是 return 一个布尔值类似于
的 POJOzone1:正确 区域 2:正确 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;
}
我想要 return Mono 但我不确定如何 return 它,这就是我现在拥有的
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 和 return 新对象的输出?
您收到此回复的第一件事
{
"zonesList": [
"zone1",
"zone2",
"zone5",
"zone4"
]
}
所以这可以映射到 Jackson 的以下自定义对象中
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class ZonesList {
private List<String> zonesList;
}
然后你可以用这个把它映射到你真正想要的另一个对象return。你定义的那个
@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;
});