2017-01-06 4 views
0

Вот мой класс иерархии:Джексон - не может сериализовать дженерики

Банан Класс:

@JsonTypeName("banana") 
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@type") 
public class Banana<T, M> extends Fruit<T, M> { 

Фруктовый класс:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME) 
    @JsonSubTypes({ @JsonSubTypes.Type(value = Banana.class, name = "banana")}) 
    public class Fruit<T, M> { 
     private boolean ok; 
     private T main; 

Класс автомобиля:

@JsonTypeName("car") 
public class Car extends Vehicle { 

Аннотация Vehicle класс:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
@JsonSubTypes({ @JsonSubTypes.Type(value = Car.class), @JsonSubTypes.Type(value = AnyOtherClass.class) }) 
public abstract class Vehicle<K> { 
    private Date date; 
    private Id<?> id; 

Так я создаю новый объект:

Banana<Car, String> ba = new Banana<Car, String>(); 
Car car = new Car("test"); 
ba.setMain(car); 

объект Банан имеет свойство "@type".

объект

Автомобиль имеет свойство «тип», и если я сериализовать автомобиль как JSON он печатает:

{"type":"car"} 

Однако, если я сериализовать банан, как JSON печатает (только «типа»: «автомобиль» является отсутствуют другие свойства объекта доступны):

{} 

Если я banana.getMain() он печатает

{"type":"car"} 

Как возможно?

Я попытался простой объект (не автомобиль) без каких-либо аннотаций и она отлично работает, как он печатает

{"type":"car"} 

Попросите кого-нибудь какую-нибудь идею Thats происходит?

+1

могли бы вы предоставить полный исходный код ваших классов? Также вы можете попробовать, если у вас все еще есть проблема, если вы не продлеваете автомобиль и фрукты? – toongeorges

+0

Он отлично работает с POJO. – Laurynas

ответ

1

Так что ответ указать корневой тип для JacksonMapper в

jacksonMapper.writerWithType(new TypeReference<Banana<Car, String>>() {})

1

Вам нужно будет предоставить более полный пример использования здесь. Я подозреваю, что это связано с параметризацией типа (то есть, для сериализации экземпляра родового типа) и Java Type Erasure, но нельзя сказать точно, не видя кода, который вы используете.

+0

Вы правы. Это связано с родовым типом. С классом POJO он отлично работает. – Laurynas