当前位置: 首页 > 知识库问答 >
问题:

如何使用对象内部的流量作为JSON响应?

陈坚
2023-03-14

在我的Spring Webflux API网关中,我通过REST从微服务接收流量:

public Flux<MyObject> getMyObjects(String id) {

    Flux<MyObject> myObjects = webClient.get().uri(nextServerUrl + "/myobject" + issueId)
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .bodyToFlux(MyObject.class);

    return myObjects;
}

我必须重新排列API网关中微服务接收到的信息,以便响应客户端。我尝试了两种方法:

  1. 尽可能使用Flux:
    private Rearranged createClientResponse(String id) {
        Rearranged rearranged = new Rearranged();

        Flux<MyObject> myObjects = myObjectService.getMyObjects(id);

        rearranged.setMyObjects(myObjects);

        myObjects.map(myObject -> {
            rearranged.setInfo(myObject.getInfo());

            //set more

            return myObjects;
        });

        return rearranged;
    }

    public class Rearranged {
        private Flux<MyObject> myObjects;
        //more attributes
    }

结果:以下为空对象:

{
    "information": null,
    "myObjects": {
        "scanAvailable": true,
        "prefetch": -1
    }
}
    private Rearranged createClientResponse(String id) {
        Rearranged rearranged = new Rearranged();

        List<MyObject> myObjects = myObjectService.getMyObjects(id).collectList().block();

        rearranged.setMyObjects(myObjects);

        rearranged.setInfo(myObjects.get(0).getInfo());

        return rearranged;
    }

    public class Rearranged {
        private List<MyObject> myObjects;
        //more attributes
    }

结果:接收异常块()/blockFirst()/blockLast()时,线程中不支持阻塞

要实现从微服务响应重新排列信息以响应客户机的可能性,正确的方法是什么?我如何才能阻止通量完成?我知道当我返回一个“同步”对象时,一个块是可能的(就像我正在做的,但仍然得到异常)?

共有1个答案

席弘图
2023-03-14

首先,您的模型不应该计算反应流。使用普通对象或列表。

public class Rearranged {
        private MyObject myObject;       
}

或者

public class Rearranged {
        private List<MyObject> myObjects;       
}

如果阻塞线程,反应器线程将在片刻内耗尽。如果getMyObject方法只接收一个对象(如果没有,请查看注释的末尾),那么您应该将其作为Mono处理。然后在createClient响应中,您必须返回Mono

 private Mono<Rearranged> createClientResponse(String id) {

       Mono<MyObject> myObjects = myObjectService.getMyObjects(id);

       return myObjects.map(myObject -> {
           retrun new Rearranged(myObject)
            //create the proper object here
        });

    }

如果您需要更多的对象,您可以使用相同的方法,例如,CollectList()Flux收集元素

 类似资料:
  • 问题内容: 我想在单个请求中发送多个不同的JSON对象,我觉得在单个请求中像文件一样流式传输多个JSON对象会更好,所以请告诉我是否可行,如果可以的话请给我一个思路要使用Alamofire做到这一点,下面是我要发布的原始正文(应用程序/ json)数据的格式 我尝试了下面的代码,但是由于body参数的格式不正确,因此无法正常工作,这就是我想尝试在单个请求中将多个JSON对象作为流发送的原因,请注意

  • 问题内容: 我想用来将json对象流放入json数组中,例如,从 至 但这行不通 自从我得到 问题答案: 用该选项将其混为一谈。 作为另一种选择,使用读取值是更灵活的选择。通常,您需要将此选项与选项结合使用,以防止第一个值过早消耗。

  • 问题内容: 嗨,我正在一个项目中,需要通过HttpClient发送某个对象的潜在巨大json,典型大小是10-20 mb的JSON。为了有效地做到这一点,我想使用流,两者都通过Json.Net来序列化一个对象,另外还要使用流来使用HttpClient发布数据。 问题 这是使用Json.net进行序列化的代码段,为了使用流,Json.net希望它将写入其中: 虽然HttpClient期望从中读取的流

  • 问题内容: 我在Spring Boot中有一个示例RestController: 我正在使用JSON库 当我点击API时,我得到一个异常提示: 路径为[]的Servlet [dispatcherServlet]的Servlet.service()抛出异常[请求处理失败;嵌套异常为java.lang.IllegalArgumentException:未找到类型为org.json.JSONObject

  • 我在Spring Boot中有一个RestController示例: 我正在使用JSON库 当我点击API时,我得到一个异常: 路径为[]的上下文中servlet[dispatcherServlet]的servlet.service()引发异常[请求处理失败;嵌套异常为java.lang.IllegalArgumentException:没有找到具有根本原因的返回值:class org.json.

  • 问题内容: 我有一个本地JSON对象,其格式如下: 我想设置此作为一个jQuery的数据源的数据表,并尝试这样的: DataTables插件加载并尝试绘制表,但显示错误“表中无可用数据” 我不是在进行AJAX调用,只是想从本地JS变量访问JSON对象。 问题答案: 提供您自己的数据的属性不是: 工作小提琴