通过Jersey-REST-Service请求单个com.codahale.metrics.Meter
时,Jackson做得很好,并将Meter序列化为(由我完成格式化)
{
"count":0,
"fiveMinuteRate":0.0,
"fifteenMinuteRate":0.0,
"oneMinuteRate":0.0,
"meanRate":0.0
}
Jackson请求Map<String, Metric>
中包含的同一仪表时,会抱怨:
未找到com.codahale.metrics.Meter类的序列化程序,也未发现创建BeanSerializer的属性(为避免异常,请禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过参考链:java.util.HashMap [“ testMetric”])< / p>
我可以使资源方法返回ObjectMapper
能够创建的String(请参见下文),但是我想让我的方法返回Map<String, Metric>
。
Jackson为什么不能自己弄清楚呢? 我如何让Jackson知道它知道如何序列化Object? 如何检查Jersey使用的ObjectMapper的配置?
我已确认地图不为空,Meter
确实在此处。
创建香草ObjectMapper
并序列化地图时
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString( myMetricMap );
它工作得很好:
{
"testMetric":
{
"count":0,
"fiveMinuteRate":0.0,
"fifteenMinuteRate":0.0,
"oneMinuteRate":0.0,
"meanRate":0.0
}
}
dropwizard-metrics
提供了一个metrics-json
软件包,其中包括用于度量标准和健康检查的序列化器。不幸的是,由于依赖混乱,我无法使用它。
编辑:
正如评论中所建议的那样,我尝试序列化Map<String, Meter>
-并成功了!
总结:
public interface Metric {
// Empty Marker Interface
}
public class Meter implements Metric {
...
}
@Path("/")
@Produces( MediaType.APPLICATION_JSON )
public MetricsResource {
@GET
@Path("metric/{metricName}")
public Metric getMetric( @PathParam String metricName ) {
// Works!
return MetricsService.getMetric( metricName );
}
@GET
@Path("metricsAsString")
public String getMetricsAsString()
{
// Works!
return (new ObjectMapper()).writeValueAsString(
MetricsService.getMetrics());
}
@GET
@Path("meters")
public Map<String, Meter> getMeters()
{
// Works!
return MetricsService.getMeters();
}
@GET
@Path("metrics")
public Map<String, Metric> getMetrics()
{
// Fails!
return metricsService.getMetrics();
}
我想杰克逊在隐式序列化时并没有确定具体的Type,而是试图基于(标记)接口Metric
进行序列化。