Jackson包含在Map <string,object =“”>中时无法序列化对象

时间:2019-04-17 08:30:03

标签: java jackson jersey codahale-metrics

通过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进行序列化。

0 个答案:

没有答案