【发布时间】:2018-07-05 06:48:41
【问题描述】:
我有一个查询远程服务的方法。此服务返回一个包含许多项目的有效负载。
如何使用Flux 和flatMapMany 取出这些物品?
目前我的“从服务获取”方法如下所示:
public Flux<Stack> listAll() {
return this.webClient
.get()
.uri("/projects")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMapMany(response -> response.bodyToFlux(Stack.class));
}
堆栈只是一个 POJO,它看起来像:
public class Stack {
String id;
String name;
String title;
String created;
}
这里没什么特别的,但我认为我的反序列化器是错误的:
protected Stack deserializeObject(JsonParser jsonParser, DeserializationContext deserializationContext, ObjectCodec objectCodec, JsonNode jsonNode) throws IOException {
log.info("JsonNode {}", jsonNode);
return Stack.builder()
.id(nullSafeValue(jsonNode.findValue("id"), String.class))
.name(nullSafeValue(jsonNode.findValue("name"), String.class))
.title(nullSafeValue(jsonNode.findValue("title"), String.class))
.created(nullSafeValue(jsonNode.findValue("created"), String.class))
.build();
}
我注意到发生的是第一个对象被正确序列化,但随后它似乎再次被序列化,而不是有效负载中的下一个对象。
传入的有效负载遵循标准 JSON API 规范,如下所示:
{
"data":[
{
"type":"stacks",
"id":"1",
"attributes":{
"name":"name_1",
"title":"title_1",
"created":"2017-03-31 12:27:59",
"created_unix":1490916479
}
},
{
"type":"stacks",
"id":"2",
"attributes":{
"name":"name_2",
"title":"title_2",
"created":"2017-03-31 12:28:00",
"created_unix":1490916480
}
},
{
"type":"stacks",
"id":"3",
"attributes":{
"name":"name_3",
"title":"title_3",
"created":"2017-03-31 12:28:01",
"created_unix":1490916481
}
}
]
}
我根据spring-reactive-university 建立了这种模式
任何关于我哪里出错的帮助都会很棒;
干杯!
【问题讨论】:
-
这个网络服务是返回一个通量还是只返回一个实体?
标签: spring flux project-reactor spring-webflux