簡體   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