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

Java 如何返回N1qlQueryResult作为Couchbase数据库的REST API响应?,java,json,spring,nosql,couchbase,Java,Json,Spring,Nosql,Couchbase,我想返回N1qlQueryResult作为我的restapi的响应。代码如下: @RequestMapping(value = "/test", method = RequestMethod.GET) public @ResponseBody ResponseEntity<?> get() { List<N1qlQueryRow> result = null; try { Cluster cluster = CouchbaseCluster

我想返回
N1qlQueryResult
作为我的
restapi
的响应。代码如下:

@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); 
}
@RequestMapping(value=“/test”,method=RequestMethod.GET)
public@ResponseBody ResponseEntity get(){
列表结果=空;
试一试{
Cluster Cluster=CouchbaseCluster.create(“localhost”);
Bucket=cluster.openBucket(“myBucket”、“xyz”);
bucket.bucketManager().createN1qlPrimaryIndex(真、假);
N1qlQueryResult queryResult=bucket.query(N1qlQuery.simple(“从myBucket中选择*));
queryResult.forEach(System.out::println);
结果=queryResult.allRows();
}捕获(最终异常){
异常。printStackTrace();
}
返回ResponseEntity.ok(结果);
}
我收到错误消息:

无法写入内容:找不到类的序列化程序 com.couchbase.client.java.query.DefaultN1qlQueryRow且无属性 发现以创建BeanSerializer(要避免异常,请禁用 SerializationFeature.FAIL_ON_EMPTY_bean)(通过引用链: java.util.ArrayList[0]);嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:无序列化程序 为类com.couchbase.client.java.query.DefaultN1qlQueryRow找到 并且没有发现创建BeanSerializer的属性(以避免 异常,禁用序列化功能。在\u空\u bean上失败(通过 引用链:java.util.ArrayList[0])


解决办法是什么?当bean为
空时,我想返回响应作为
JSON

ObjectMapper
默认情况下失败。我们可以按如下方式禁用此功能:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
但在您的情况下,它并不能解决问题,因为结果无论如何都是空的。返回不代表
POJO
本身的
类型
-s是不可取的
N1qlQueryResult
DefaultAsyncN1qlQueryRow
没有经典的
getter
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()));
当然,当您有许多这样的方法时,您可以编写公共层,将此类对象转换为
Map
或编写自定义序列化程序,并通过
Spring
容器配置
ObjectMapper
用户

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

result.allRows()
        .stream()
        .map(i -> i.value().toMap())
        .collect(Collectors.toList())

但是它返回每个项目的bucket名称,我已经编写了类似的代码。我想要的是简单的json,例如,如果db中的行类似于:第一行:{“key1”:“value1”},第二行:{“key2”:“value2”}。输出应该是:[{“key1”:“value1”}、{“key2”:“value2”}]。@iAmLearning,请参阅我的更新。只需使用
streamapi
foreach
N1qlQueryResult
转换为对象列表,即可将
Map
-s转换为对象列表。
result.allRows()
        .stream()
        .map(i -> i.value().toMap())
        .collect(Collectors.toList())