[英]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
不是好主意。 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
公共層,或者編寫自定義序列化程序並通過Spring
容器配置ObjectMapper
用戶。
編輯
如果只想返回行,則返回:
result.allRows()
.stream()
.map(i -> i.value().toMap())
.collect(Collectors.toList())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.