代码之家  ›  专栏  ›  技术社区  ›  Chris

如何修改具有弹簧反应的通量的结果

  •  1
  • Chris  · 技术社区  · 8 年前

    我正在尝试转换 Flux 为了使用Json API规范进行确认,我有一个标准方法,用于转换 POJO 并以字符串形式返回json。这与 Mono .

    然而,我无法训练如何使用 通量 .

    @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));
    }
    

    “全部查找”得到所有 FeedItem 来自反应性mongo数据库。然后我就糊涂了。使用 flatMap 我可以一次处理每个项目并将其转换为字符串(使用下面的方法确认符合规范),但这不起作用,因为每个项目都是独立处理的,这意味着返回无效的Json(否 , 各项目之间)。

    是否有其他方法可以修改来自Spring控制器的传出数据?

    编辑: 我知道我可以用

    public Mono<String> findAll() {
        List<FeedItem> feedItems = feedItemRepository.findAll().collectList().block();
    
        return writeList(feedItems);
    }
    

    但我相信这是一个可怕的想法 block() 就像那样。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Frischling    8 年前

    什么是返回 Mono<FeedItem> 给你什么?仅仅是一个指针:如果FeedItem是一个json pojo,您应该能够返回它。无需以编程方式进行json编组/解编,框架将为您完成这项工作。

    就像这里: https://dzone.com/articles/spring-webflux-first-steps 以及许多其他类似的例子。