【发布时间】:2018-03-06 21:34:40
【问题描述】:
我在尝试反序列化以下类时遇到问题:
public class MetricValuesDto {
private Map<MetricType, MetricValueDto<?>> metricValues;
public MetricValuesDto() {
}
public MetricValuesDto(Map<MetricType, MetricValueDto<?>> metricValues) {
this.metricValues = metricValues;
}
public Map<MetricType, MetricValueDto<?>> getMetricValues() {
return metricValues;
}
public void setMetricValues(Map<MetricType, MetricValueDto<?>> metricValues) {
this.metricValues = metricValues;
}
}
我的通用抽象类:
public abstract class MetricValueDto<T> {
private T value;
private MetricTrend trend;
public MetricValueDto(T value, MetricTrend trend) {
this.value = value;
this.trend = trend;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public MetricTrend getTrend() {
return trend;
}
public void setTrend(MetricTrend trend) {
this.trend = trend;
}
}
我有两个实现MetricValueDto的具体类:
IntMetricValueDto:
public class IntMetricValueDto extends MetricValueDto<Integer> {
public IntMetricValueDto(Integer value, MetricTrend trend) {
super(value, trend);
}
}
FloatMetricValueDto:
public class FloatMetricValueDto extends MetricValueDto<Float> {
public FloatMetricValueDto(Float value, MetricTrend trend) {
super(value, trend);
}
}
知道什么是反序列化 MetricValueDto 的正确策略,以便我可以通过 ObjectMapper 或 RestTemplate 解析它吗?每当我跑步时:
restTemplate.exchange("myEndpoint", HttpMethod.GET, entity, DataCollectionEventDto.class);
我明白了
原因:com.fasterxml.jackson.databind.JsonMappingException:无法构造com.resson.dto.MetricValueDto的实例:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么包含额外的类型信息
DataCollectionEventDto:
public class DataCollectionEventDto {
private List<MapLayerDto> mapLayers;
@JsonUnwrapped
private MetricValuesDto metricValues;
public List<MapLayerDto> getMapLayers() {
return mapLayers;
}
public void setMapLayers(List<MapLayerDto> mapLayers) {
this.mapLayers = mapLayers;
}
public MetricValuesDto getMetricValues() {
return metricValues;
}
public void setMetricValues(MetricValuesDto metricValues) {
this.metricValues = metricValues;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
我基本上已经尝试了网络上的所有内容,但我无法使其工作;任何建议都会有所帮助。
【问题讨论】:
-
这个问题有你想要完成的答案。 stackoverflow.com/questions/31665620/… 基本上你需要定义你的抽象类的所有可能的子类型。
标签: java spring serialization jackson type-erasure