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为
空时,我想返回响应作为JSONObjectMapper
默认情况下失败。我们可以按如下方式禁用此功能:
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())