2012-10-05 27 views
22

estoy usando Jackson y estoy teniendo problemas, cuando trato de deserializar un objeto me sale el siguiente error:no puede construir instancia de - 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 

estoy teniendo problemas en el atributo:

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

¿Alguien podría ayudarme?

+0

Otra discusión sobre un caso similar se realiza en https://stackoverflow.com/a/32777371/873282. Especialmente interesante es el comentario que indica usar '@JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property =" type ")'. De esa manera, el JSON es un poco más grande, pero es explícito, qué tipo debe usarse. – koppor

Respuesta

24

No se puede instanciar una clase abstracta, Jackson tampoco. Debería darle a Jackson información sobre cómo crear una instancia de MyAbstractClass con un tipo concreto.

Ver esta respuesta en stackoverflow: Jackson JSON library: how to instantiate a class that contains abstract fields

Y tal vez también vea sentido Jackson Polymorphic type handling

+2

Gracias por la ayuda, que se resolvieron con: 'JsonTypeInfo.Id.NAME, incluyen = JsonTypeInfo.As.PROPERTY, propiedad = "clase")' ' la propiedad = "clase"', viene en mi informante JSON qué clase de niños se usará. –

+1

Tenga cuidado, permitiendo a los usuarios especificar qué clase usar durante la deserialización podría generar vulnerabilidades como [this] (http://fishbowl.pastiche.org/2015/11/09/java_serialization_bug/). –

+0

Gracias por la referencia: @JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") hace el truco. Al igual que el valor del descriminador de tabla JPA. Gracias. – 99Sono

6

Su declaración no hace @JsonSubTypes: necesita a la lista de ejecución clases (sub), no a la clase en sí (que lo haría ser inútil). Entonces necesita modificar esa entrada para enumerar las subclase (s) que hay; o use algún otro mecanismo para registrar subclases (SimpleModule tiene algo así como addAbstractTypeMapping).

Cuestiones relacionadas