首页 > 解决方案 > 杰克逊遗产

问题描述

似乎无法弄清楚这一点。我不断收到各种错误,所以我将用我从杰克逊那里得到的当前错误来写这个。

public class ResponseDetail {
    private Response response;
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
    @JsonSubTypes.Type(value = ResponseTypeOne.class, name = "ResponseTypeOne"),
    @JsonSubTypes.Type(value = ResponseTypeTwo.class, name = "ResponseTypeTwo"),
    @JsonSubTypes.Type(value = ResponseTypeThree.class, name = "ResponseTypeThree")
})
@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class Response {
}

在其他包中,我有这三个:

public class ResponseTypeOne extends Response {
     private Integer status;
}
public class ResponseTypeTwo extends Response {
    private String message;
}
public class ResponseTypeThree extends Response {
     private String value;
}

错误:

Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class com.services.models.Response]: missing type id property '@type' (for POJO property 'response')

我已经尝试过各种各样的迭代,@JsonTypeInfoincludes没有property运气Id.CLASS

标签: spring-bootjacksonjackson-databind

解决方案


您需要声明应如何识别类型。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@ttype")
@JsonSubTypes({
    @JsonSubTypes.Type(value = ResponseTypeOne.class, name = "ResponseTypeOne"),
    @JsonSubTypes.Type(value = ResponseTypeTwo.class, name = "ResponseTypeTwo"),
    @JsonSubTypes.Type(value = ResponseTypeThree.class, name = "ResponseTypeThree")
})

@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class Response {
   @JsonProperty("@ttype")
   public abstract String getChildType();
}

在子类型中,如下所示:

   @JsonTypeName("ResponseTypeOne")
    public class ResponseTypeOne extends Response {
        @Override
        public String getChildType() {
            return "ResponseTypeOne";
        }
    }

传入的 json 应该如下所示,以使杰克逊能够找到正确的子实现:

{
  //some attributes of child Response
  "@ttype": "ResponseTypeOne"
}

推荐阅读