2012-10-05 8 views
22

używam Jacksona i mam problemy, gdy próbuję deserializowania obiektom pojawia się następujący błąd:Nie można konstruować wystąpienie z - Jackson

com.fasterxml.jackson.databind.JsonMappingException: 
    Can not construct instance of net.MyAbstractClass, 
    problem: abstract types either need to be mapped to concrete types, 
     have custom deserializer, or be instantiated with additional type information 

Mam problemy z atrybutem:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "@id") 
@JsonSubTypes({ @JsonSubTypes.Type(value = MyAbstractClass.class, name = "MyAbstractClass") }) 
@ManyToOne 
private MyAbstractClass object; 

Czy ktoś może mi pomóc?

+0

Kolejna dyskusja na podobny temat odbywa się pod adresem https://stackoverflow.com/a/32777371/873282. Szczególnie interesujący jest komentarz stwierdzający użycie '@JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property =" type ")'. W ten sposób JSON jest nieco większy, ale jest wyraźny, jakiego typu należy użyć. – koppor

Odpowiedz

24

Nie można inicjować zajęć abstrakcyjnych, ani Jackson. Powinieneś przekazać Jacksonowi informacje na temat tworzenia instancji MyAbstractClass z konkretnym typem.

Zobacz tę odpowiedź na StackOverflow: Jackson JSON library: how to instantiate a class that contains abstract fields

a może także zobaczyć Jackson Polymorphic type handling

+2

Dzięki za pomoc, postanowiłem z: 'JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "klasa")' Opcja 'property = "klasa"', zbliża się w moim JSON informowania jaka klasa dziecka będzie używana. –

+1

Uwaga! Umożliwienie użytkownikom określenia, której klasy należy użyć podczas deserializacji, może prowadzić do luk w zabezpieczeniach, takich jak [this] (http://fishbowl.pastiche.org/2015/11/09/java_serialization_bug/). –

+0

Dzięki za referencję: @JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") robi lewę. Podobnie jak wartość przypisana do tabeli JPA. Dzięki. – 99Sono

6

Twoja deklaracja @JsonSubTypes nie ma sensu: to musi notować wdrożeniowe (sub) zajęcia, a nie sam klasę (co być bezcelowe). Więc musisz zmodyfikować ten wpis do pod-klasy (klas); lub użyj jakiegoś innego mechanizmu do zarejestrowania podklas (SimpleModule ma coś takiego jak addAbstractTypeMapping).