如何使用 Spring Reactive 修改 Flux 的结果
How to modify results from a Flux with Spring Reactive
我正在尝试转换 Flux
的结果以确认 Json API 规范。我有我的标准方法,可以将 POJO
转换为正确的格式,并将 returns 和 json 作为字符串。这与 Mono
完美配合。
但是我不知道如何用 Flux
来处理这个问题。
@GetMapping(value = "/", produces = "application/vnd.api+json")
@ResponseBody
public Flux<String> findAll() {
return feedItemRepository.findAll().flatMap(this::createJsonApiSpec);
}
private Mono<String> createJsonApiSpec(FeedItem item) {
ObjectMapper objectMapper = new ObjectMapper();
ResourceConverter resourceConverter = new ResourceConverter(objectMapper, FeedItem.class);
JSONAPIDocument<Object> document = new JSONAPIDocument<>(item);
byte[] bytes = new byte[0];
try {
bytes = resourceConverter.writeDocument(document);
} catch (DocumentSerializationException e) {
e.printStackTrace();
}
return Mono.justOrEmpty(new String(bytes));
}
查找全部从反应性 mongo 数据库中获取所有 FeedItem
。然后我就糊涂了。使用 flatMap
我可以一次处理每个项目并将其转换为字符串(使用下面的方法确认符合规范)但这不起作用,因为每个项目都是独立处理的,这意味着无效 Json返回(每个项目之间没有 ,
)。
还有其他方法可以修改从 Spring 控制器传出的数据吗?
编辑:我知道我可以使用
完成这项工作
public Mono<String> findAll() {
List<FeedItem> feedItems = feedItemRepository.findAll().collectList().block();
return writeList(feedItems);
}
但我确信这样使用 block()
是个糟糕的主意。
returning Mono<FeedItem>
给你什么?只是一个指针:如果 FeedItem 是一个 json pojo,你应该可以 return 那个。无需以编程方式执行 json marshalling/unmarshalling,框架会为您完成。
在这里点赞:https://dzone.com/articles/spring-webflux-first-steps
以及沿线的许多其他示例。
我正在尝试转换 Flux
的结果以确认 Json API 规范。我有我的标准方法,可以将 POJO
转换为正确的格式,并将 returns 和 json 作为字符串。这与 Mono
完美配合。
但是我不知道如何用 Flux
来处理这个问题。
@GetMapping(value = "/", produces = "application/vnd.api+json")
@ResponseBody
public Flux<String> findAll() {
return feedItemRepository.findAll().flatMap(this::createJsonApiSpec);
}
private Mono<String> createJsonApiSpec(FeedItem item) {
ObjectMapper objectMapper = new ObjectMapper();
ResourceConverter resourceConverter = new ResourceConverter(objectMapper, FeedItem.class);
JSONAPIDocument<Object> document = new JSONAPIDocument<>(item);
byte[] bytes = new byte[0];
try {
bytes = resourceConverter.writeDocument(document);
} catch (DocumentSerializationException e) {
e.printStackTrace();
}
return Mono.justOrEmpty(new String(bytes));
}
查找全部从反应性 mongo 数据库中获取所有 FeedItem
。然后我就糊涂了。使用 flatMap
我可以一次处理每个项目并将其转换为字符串(使用下面的方法确认符合规范)但这不起作用,因为每个项目都是独立处理的,这意味着无效 Json返回(每个项目之间没有 ,
)。
还有其他方法可以修改从 Spring 控制器传出的数据吗?
编辑:我知道我可以使用
完成这项工作public Mono<String> findAll() {
List<FeedItem> feedItems = feedItemRepository.findAll().collectList().block();
return writeList(feedItems);
}
但我确信这样使用 block()
是个糟糕的主意。
returning Mono<FeedItem>
给你什么?只是一个指针:如果 FeedItem 是一个 json pojo,你应该可以 return 那个。无需以编程方式执行 json marshalling/unmarshalling,框架会为您完成。
在这里点赞:https://dzone.com/articles/spring-webflux-first-steps 以及沿线的许多其他示例。