java - 通用抽象类的自定义 Jackson 反序列化

标签 java spring serialization jackson type-erasure

我在尝试反序列化以下类时遇到问题:

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);

我明白了

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.resson.dto.MetricValueDto: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

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);
    }
}

我基本上在网上尝试了所有的东西,但我无法让它工作;任何建议都会有所帮助。

最佳答案

使用 JsonSubTypes 注释和 JsonTypeInfo 来指示子类型。 property属性JsonTypeInfo用于区分不同的子类。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "typ")
@JsonSubTypes({
        @JsonSubTypes.Type(value = IntMetricValueDto.class, name = "INT"),
        @JsonSubTypes.Type(value = FloatMetricValueDto.class, name = "FLT")})
public abstract class MetricValueDto<T> {

    private T value;
    private MetricTrend trend;
    ...
}

关于java - 通用抽象类的自定义 Jackson 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46413269/

相关文章:

java - 在 Spring 中处理空的 RequestBody

java - 在 spring 上下文初始化开始之前执行一段 java 代码

java - 重新序列化后,对象是否可能具有不同的字节大小?

c# - 如何对 'Type' 进行 XML 序列化

Java:修改参数时使用 .clone() 的替代方案?

java - 将 DefaultCategoryDataset 值写入文件

java - 当我们有一个同名的对象时,引用一个类

JAVA。 GSON。如何将参数传递给 toJson()?

java - 启动 Spring 应用程序时出错 : Initialization of bean failed; nested exception is AbstractMethodError

c# - 从 .NET 3.5 更新到 .NET 4.6 后出现 XmlSerializer 错误