我想把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是ObjectMapper
时,empty
默认失败。我们可以像下面这样禁用它:
ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
但在你的情况下,它无法解决问题,因为无论如何结果都是空的。返回不代表type
本身的POJO
-s是没有好主意的。 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
或编写自定义序列化器,并通过ObjectMapper
容器配置Spring
用户。
编辑 如果您只想返回行返回:
result.allRows()
.stream()
.map(i -> i.value().toMap())
.collect(Collectors.toList())