如何让Jersey客户端在根请求实体周围编写`[`和`]`?

时间:2014-09-30 17:38:43

标签: java xml json jaxb jersey

这个非常简单的请求令我头疼......

我正在尝试使用Jersey客户端将POST数据导入InfluxDB。

他们想要这种格式的数据

[
  {
    "name": "log_lines",
    "columns": ["time", "line"],
    "points": [
      [1400425947368, "here's some useful log info"]
    ]
  }
]

所以我的实体看起来像这样:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class InfluxDbStat implements Serializable {
    private static final long serialVersionUID = 1L;
    @XmlElement
    public String name;
    @XmlElement
    public String[] columns;
    @XmlElement
    public String[] points;
}

转换为:

{  
   "name":"pointcut_performance",
   "columns":[  
      "time",
      "pointcut",
      "length"
   ],
   "points":[  
      "1412098229880",
      "com.xxx.notes.restapi.NoteTakerController.postNote(ApiNote)",
      "105"
   ]
}

我正在调用这样的端点:

influxDbResource.queryParam("u", influxDbUser).queryParam("p", influxDbPassword).queryParam("time_precision", "ms").accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON).post(influxDbStat);

如何将方括号打印为根?

1 个答案:

答案 0 :(得分:1)

我会发布我的回答,希望有一天有类似问题的人能够从中受益。

首先,我切换到官方的InfluxDB Java客户端,实际上工作正常。我很高兴使用这个解决方案,但它涉及到另一个依赖我的项目,我不是特别高兴。还有一个开放的bug,其中毫秒被解释为微秒(https://github.com/influxdb/influxdb-java/issues/13)。有点是派对破坏者。

第二种方式是一点点诡计。 Sotirios Delimanolis在评论中为我提供了线索。首先,将响应对象包装在一个数组中:new InfluxDbStat[]{influxDbStat};然后,拧紧JAXB。我找不到任何一个marshallers,杰克逊,Jettison,Moxy,(可悲的是,甚至是可靠的Eclipse Moxy)都没能产生“正常”的兴趣 - 像行家一样的JSON。尽管如此,我们已经将GSON作为依赖项传递过来了,所以我们决定只使用声明的依赖项并使用它。所以,只需做一个gson.toJson(new InfluxDbStat[]{influxDbStat}),你就可以了!

我们在第一篇文章中发现的另一个错误是points变量实际上需要声明为public int[][] points,因为InfluxDB允许您一次提交多行。

无论如何祝你好运并且快乐的InfluxDBing!