Spring @JsonSubTypes具有非常不同的抽象类结构

时间:2017-07-21 20:25:03

标签: java json spring jackson

我试图从HTTP请求中接收时间对象。以下请求是可能的,每个请求都应生成不同的类。

time: {
    type: relative          | absolute,
    value: string(eg:L24H)  | {startTime: xxxx, endTime: xxxx}
}

根据type生成的类。希望这部分是自我解释的。 我用一个抽象创建了以下结构,并使两个类扩展了它。

@JsonTypeInfo(
    use =Id.NAME,
    include = As.PROPERTY,
    property = "type",
    visible = true
)
@JsonSubTypes({

    @JsonSubTypes.Type(value = RelativeSearchTimeRange.class, name = "relative"),
    @JsonSubTypes.Type(value = AbsoluteSearchTimeRange.class, name = "absolute")


})

public abstract class SearchTimeRange<V> {
  private String type;

  private V value;

  private Time time;

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }


  public V getValue() {
    return value;
  }

  public void setValue(V value) {
      this.value = value;
    }
}

在第一次实施中正常工作

public class RelativeSearchTimeRange extends SearchTimeRange<RelativeSearchTimeRange.RelativeTime> {

  enum RelativeTime {
    L24H, L3D;
  }

  private RelativeTime value;


  @Override public void setValue(RelativeTime value) {
    this.value = value;
  }

  @Override public RelativeTime getValue() {
    return value;
  }

但第二个失败了:

public class AbsoluteSearchTimeRange extends SearchTimeRange<AbsoluteSearchTimeRange> {

  private Time value;

public void setValue(Time value) {
    this.value = value;
  }

  public AbsoluteSearchTimeRange(Long startTime, Long endTime) {
    value = new Time(startTime, endTime);
  }

  @Override public Time getTime() {
    return value;
  }
}

错误:Could not read document: Can not construct instance of io.redlock.common.dal.AbsoluteSearchTimeRange, problem: null

Time类看起来像这样(有适当的getter和setter):

public class Time {
  long startTime;
  long endTime;
}

AbsoluteTimeRange中缺少什么?

1 个答案:

答案 0 :(得分:0)

我仍然不确定为什么它有效,但我必须在AbsoluteTimeRange类中添加默认构造函数。

如果有人能够进一步澄清,那么最受欢迎。