2010-06-25 10 views
8

Actualmente estoy usando Jackson 1.4.2 y estoy intentando deserializar los valores code (identificadores únicos para la información de tipo) que pasan de nuestra IU a los controladores Java (Servlets).Jackson no reconoce la anotación @JsonCreator

hay múltiples tipos (por ejemplo ABCType, XYZType, etc.) que se extienden todos desde una AbstractType, pero cada tipo de hormigón tiene un método de fábrica estática que toma como un solo parámetro, un identificador único, y devuelve el objeto de tipo (nombre, tipos asociados, descripción, acrónimos válidos, etc.) representados por ese identificador. El método estático dentro de cada tipo concreto (por ejemplo XYZType) se anota con @JsonCreator:

@JsonCreator 
public static XYZType getInstance(String code) { 
    ..... 
} 

El problema que estoy viendo es sin embargo una excepción lanzada por asignador de Jackson intentar deserializar el JSON a esos tipos:

Causado por: org.codehaus.jackson.map.JsonMappingException: No se encontró ningún constructor predeterminado para el tipo [tipo simple, clase com.company.type.XYZtype]: no se puede crear una instancia del objeto Json.

Qué me estoy perdiendo aquí @JsonCreator de la anotación a métodos estáticos (de fábrica o se trata de hacer con Jackson 1.4.2 luchando con los tipos de hormigón que se extienden desde una AbstractType?)?

Respuesta

12

La anotación @JsonCreator requiere la anotación @JsonProperty. Este Jackson wiki page da poca información pero ofrece código de ejemplo:

@JsonCreator 
public Name(@JsonProperty("givenName") String g, @JsonProperty("familyName") String f) 
{ 
    givenName = g; 
    familyName = f; 
} 

encontrará una explicación más detallada en this blog post. Por lo tanto,

Su código de muestra debe ser algo como esto:

@JsonCreator 
public static XYZType getInstance(@JsonProperty("someCode") String code) 
{ 
... 
} 
4

El problema es que Jackson solo ve el tipo base declarado y no sabe dónde buscar subtipos. Desde que se agregó el manejo de tipo polimórfico completo en 1.5, lo que necesita hacer con 1.4 es agregar el método de fábrica en la clase base y enviar los métodos desde allí.

Cuestiones relacionadas