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

如何返回N1qlQueryResult作为Couchbase数据库的REST API的响应?

缑兴贤
2023-03-14

我想返回N1QLQueryResult作为我的REST API的响应。下面是代码:

@RequestMapping(value = "/test", method = RequestMethod.GET)
public @ResponseBody ResponseEntity<?> get() {
    List<N1qlQueryRow> result = null;
    try {
        Cluster cluster = CouchbaseCluster.create("localhost");
        Bucket bucket = cluster.openBucket("myBucket", "xyz");
        bucket.bucketManager().createN1qlPrimaryIndex(true, false);
        N1qlQueryResult queryResult = bucket.query(N1qlQuery.simple("select * FROM myBucket"));
        queryResult.forEach(System.out::println);
        result = queryResult.allRows();
    } catch (final Exception exception) {
        exception.printStackTrace();
    }
    return ResponseEntity.ok(result); 
}

我收到错误消息:

无法写入内容:未找到类com.couchbase.client.java.query.defaultn1qlqueryrow的序列化程序,也未找到创建BeanSerializer的属性(为避免异常,禁用SerializationFeature.fail_on_empty_beans)(通过引用链:java.util.ArrayList[0]);嵌套异常为com.fasterxml.jackson.databind.JSONMappingException:未找到类com.couchbase.client.java.query.defaultn1QLQueryRow的序列化程序,也未发现创建BeanSerializer的属性(为避免异常,禁用SerializationFeature.fail_on_empty_beans)(通过引用链:java.util.ArrayList[0])

解决办法是什么?我想以json的形式返回响应。

共有1个答案

公良浩邈
2023-03-14

默认情况下,当bean为时,objectmapper失败。我们可以像下面这样禁用它:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

但在您的情况下,它并不能解决问题,因为结果无论如何都是空的。返回不表示POJO本身的type-s不是一个好主意。N1QLQueryResultDefaultAsyncn1QLQueryRow没有经典的getters并且Jackson默认情况下不识别类似于value()的方法。我建议创建map 并手动生成所需的输出和包含所需的属性:

Map<String, Object> n1QlResult = new HashMap<>();
n1QlResult.put("status", result.status());
// other ...
n1QlResult.put("rows", result.allRows()
        .stream()
        .map(i -> i.value().toMap())
        .collect(Collectors.toList()));

最后返回:

return ResponseEntity.ok(n1QlResult);

当然,当您有许多这样的方法时,您可以编写公共层,将这类对象转换为map或编写自定义序列化程序,并通过spring容器配置objectmapper用户。

如果要只返回行,请编辑
返回:

result.allRows()
        .stream()
        .map(i -> i.value().toMap())
        .collect(Collectors.toList())
 类似资料:
  • 问题内容: 我想返回axios的响应,但始终返回的响应是不确定的: 控制台始终记录为未定义。他们以任何方式返回此响应。 问题答案: console.log不会等到该功能完全完成后再进行记录。这意味着您将必须进行异步处理,主要有两种方法: 回调-这是当您将函数作为参数传递到现有函数中时,将在axios调用完成后执行。这是如何与您的代码一起使用的: Promise-实现此目的的最简单方法是将其放在函数

  • 60657883876982836210323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232606578878369829583846584858362797560476578878369829583846584858362103232323232323232

  • 当我使用MVC控制器时,我使用“返回OK(对象)”或“返回BadRequest(ErrorMessage)”等。 我怎样才能实现这是剃刀页? 我尝试返回新的JSON result(object);这在状态代码为200时有效。但是如果我想返回带有JSON错误消息的状态代码400呢?

  • 我有一个函数,可以使用Pandas分析CSV文件并生成包含摘要信息的编辑器。我想从Flask视图返回结果作为响应。如何返回JSON响应?

  • 我们尝试使用用户访问控制实现 RestAPI,其中相同的 URI 应为具有不同角色的两个用户返回不同的响应。比如说,对 URI 的响应(/resource/123) 如何根据角色隐藏每个属性。 隐藏用户不应访问的节点 问题:这会破坏响应结构。客户端可能会中断,因为预期的节点会被遗漏。 为该节点返回 null。 问题:这将破坏响应数据类型。因为“布尔”节点将具有空值。 返回该节点的默认值。 问题:这

  • 问题内容: 使用该方法时,我正努力筛选返回的数据以准确获得所需的数据。我知道这很容易使用,可能还有其他jQuery AJAX方法,但是我需要专门使用。 例如,我知道这可行; 但是,如果我只想要id =“ foo”的div的内容怎么办? 理想情况下,我想要一个可以传递普通jQuery选择器的方法,该方法将用于选择标题,div或jQuery选择的任何其他元素。这样我可以将任何字符串传递到我自己的aja