java - 如何返回 N1qlQueryResult 作为 Couchbase 数据库的 REST API 的响应?
问题描述
我想返回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: No serializer found for class com.couchbase.client.java.query.DefaultN1qlQueryRow 并且没有发现用于创建 BeanSerializer 的属性(为避免异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过引用链: java.util.ArrayList[0])
解决办法是什么?我想将响应返回为JSON
.
解决方案
ObjectMapper
默认情况下,当 bean 为empty
. 我们可以像下面这样禁用它:
ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
但在您的情况下,它不能解决问题,因为结果无论如何都是空的。返回type
不代表POJO
自身的 -s 并不是一个好主意。N1qlQueryResult
并且默认情况下DefaultAsyncN1qlQueryRow
没有经典getters
并且Jackson
不识别类似的方法。value()
我建议Map<String, Object>
手动创建和构建所需的输出并包含所需的属性:
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
或者编写自定义序列化器并按容器配置ObjectMapper
用户。Spring
编辑
如果您只想返回行返回:
result.allRows()
.stream()
.map(i -> i.value().toMap())
.collect(Collectors.toList())
推荐阅读
- powershell - Powershell 从 Visual Basic 脚本中获取返回值
- php - 我通过 sql 从数据库中获取所有值
- angularjs - 是否可以将 Angular 表单数据保存回范围,以便在单个非托管 HTML 文件的刷新之间保持不变?
- javascript - Mongo 动态搜索键值查询
- angular - 在 PWA 中替换 inAppBrowser
- wordpress - 我的网站关闭,因为我直接在 function.php 主题中使用了删除操作
- flutter - Stateful widget 不更新,在 setState 更新后,如何解决?
- node.js - Alexa 技能偶尔会死机/崩溃/退出而没有错误
- sql-server - 在操作之前存在表
- javascript - 变量问题:未捕获的类型错误:无法读取未定义的属性“推送”