如何使用 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 以及沿线的许多其他示例。