【问题标题】:Creating JSON Response in javax.ws.rs resource from Elasticsearch XContentBuilder从 Elasticsearch XContentBuilder 在 javax.ws.rs 资源中创建 JSON 响应
【发布时间】:2023-04-04 00:11:01
【问题描述】:

我确信这很简单,但我还没有找到它的文档或示例。我想要做的是基于来自 Elasticsearch GetResponse 的 XContent 返回一个 JSON 对象。代码摘录如下所示:

    @GET
    @Path("get/{index}/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response get(@PathParam("index") String index, @PathParam("id") String id) {
        RestHighLevelClient client = ElasticAI.client();

        GetRequest req = new GetRequest(index, id);
        try {
            GetResponse resp = client.get(req, RequestOptions.DEFAULT);
            XContentBuilder xcb = XContentFactory.jsonBuilder();
            resp.toXContent(xcb, ToXContent.EMPTY_PARAMS);

            return Response.ok(<what goes here?>).build();

        /// etc

我缺少的是如何让 XContentBuilder 生成一个对象,MOxy 或 Jackson 支持的标准转换器之一可以将其转换为 APPLICATION_JSON。

【问题讨论】:

  • 我不熟悉 ElasticSearch API,但我想在某些时候你会想要写出一个输出流。您可以使用 StreamingOutput 获取 OutputStream。我看到 jsonBuilder() 方法接受 XContentBuilder 将结果写入的 OutputStream,无论这些“结果”是什么。就像我说的,我不熟悉图书馆。希望这会有所帮助。
  • @PaulSamsotha 感谢您的意见,我确实找到了一个解决方案,我将很快发布。

标签: elasticsearch jackson jax-rs moxy


【解决方案1】:

通过一些挖掘,我确实找到了一个可行的解决方案,尽管我不知道这是否是该库的使用方式。获胜的解决方案(到目前为止)是:

import org.elasticsearch.common.Strings
...
return Response.ok(Strings.toString(xcb)).build();

XContent 结构的目的是拥有类似于其中一种 JSON 模型的通用对象,但 XContent 似乎在内部具有优化的二进制形式。这么快我猜。但是,除了非常稀疏的 javadoc 之外,我发现关于它的文档很少。因此,如果有人可以对此进行编辑以包含指向一些规范性文本的链接,我当然希望看到它。

我在此处发布此内容以防其他人遇到此问题。从高或低看,我看不到很多关于如何以这种方式使用 Elasticsearch 的 XContent 对象的易于理解的教程或示例。

【讨论】:

    猜你喜欢
    • 2014-10-17
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    相关资源
    最近更新 更多