Наследование Джексона - PullRequest
1 голос
/ 03 июня 2019

Не могу понять это. Я продолжаю получать различные ошибки, поэтому я просто напишу это с текущей ошибкой, которую я получаю от Джексона.

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

Я пробовал различные итерации этого @JsonTypeInfo с различными includes и различными property также с Id.CLASS без удачи.

1 Ответ

0 голосов
/ 03 июня 2019

Вам необходимо указать способ распознавания типа.

@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"
}
...