Полиморфные объекты Джексона сериализуют / десериализуют - поле дочерних классов не заполнено - PullRequest
0 голосов
/ 06 января 2019

У меня есть полиморфная иерархия классов, которую нужно отправлять / извлекать в / из REST Api.

@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = 
       JsonTypeInfo.As.PROPERTY, property = "@class")
public class Property implements IProperty, Serializable {
    private static final long serialVersionUID = 1L;

    private String name;

И, например, один из его детей:

public class PropertyEnum extends Property {
   private static final long serialVersionUID = 1L;

   private String value;
   private Collection<String> values = new LinkedList<String>();

При отправке массивов Property [] для отдыха ресурса или их получении, поле значения из PropertyEnum пустое и не заполняется! Поле значений в другой руке заполнено. имя заполнено наверняка, потому что оно находится в родительском классе.

Я тоже пробовал:

//@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", include =JsonTypeInfo.As.EXTERNAL_PROPERTY)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, 
property = "name")
@JsonSubTypes(value = { 
   @JsonSubTypes.Type(value = PropertyEnum.class, name = "enum")
})

@JsonTypeName("enum")
public class PropertyEnum extends Property {

(Несмотря на то, что при добавлении новых типов требуется постоянно поддерживать код!)

еще одна попытка:

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

    @JsonSubTypes.Type(value=PropertyEnum.class)
})
public class Property implements IProperty, Serializable {
private static final long serialVersionUID = 1L;

private String name;

protected Property(){}

...

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, 
property="objectType")
public class PropertyEnum extends Property {
    private static final long serialVersionUID = 1L;

    private String value;
    private Collection<String> values = new LinkedList<String>();

    protected PropertyEnum(){}

Но у меня странное поведение ... одно для дочерних полей заполняется (значения), а другое (значение) нет? У меня есть сеттер / геттер для обоих!

Есть идеи?

С уважением.

1 Ответ

0 голосов
/ 07 января 2019

Я до сих пор не понял, почему одно поле не заполнено, а другие нет, но я решил это, добавив эту аннотацию @JsonProperty к проблемному полю.

Мое решение:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, 
 property = "@class")
public class Property implements IProperty, Serializable {
   private static final long serialVersionUID = 1L;

   private String name;

   protected Property(){}

...

public class PropertyEnum extends Property {
private static final long serialVersionUID = 1L;
   @JsonProperty
   private String value;

   private Collection<String> values = new LinkedList<String>();

   protected PropertyEnum(){}
...