繁体   English   中英

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

[英]How to return N1qlQueryResult as the response of REST API for Couchbase databse?

我想返回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返回。

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

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

但对于您而言,它不能解决问题,因为无论如何结果都是空的。 返回不代表POJO本身的-s type不是好主意。 N1qlQueryResultDefaultAsyncN1qlQueryRow没有经典gettersJackson不承认方法相似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公共层,或者编写自定义序列化程序并通过Spring容器配置ObjectMapper用户。

编辑
如果只想返回行,则返回:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM