2011-09-15 8 views
5

Actualmente estoy usando jackson 1.7 intentando deserializar un objeto de una biblioteca de terceros.¿Qué pasa con mi anotación @JsonCreator y MixIn?

Así que creé mi ObjectMapper usar mi clase MixIn así:

ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    mapper.getDeserializationConfig().addMixInAnnotations(com.vividsolutions.jts.geom.Point.class, MixIn.class); 

Y mi clase MixIn anotado con @JsonCreator y con la lógica de ejecutar el punto objeto no

public class MixIn { 
private static final GeometryFactory geometryFactory = GeometryFactoryFactory.getGeometryFactory(); 

@JsonCreator 
public static Point createPoint(@JsonProperty("x")double x, @JsonProperty("y")double y) { 
    return geometryFactory.createPoint(new Coordinate(x, y)); 
}} 

Pero me estoy haciendo la excepción

No suitable constructor found for type [simple type, class com.vividsolutions.jts.geom.Point]: can not instantiate from JSON object (need to add/enable type information?) 

La depuración muestra que mi clase MixIn nunca se llama, pensé que tenía que ser una clase concreta pero tenía el mismo resultado.

¿Qué estoy haciendo mal? ¿Qué pasa con mi configuración?

Gracias

Respuesta

6

El problema es que en el supuesto de mezcla-ins se utilizarían para otra cosa que añadir anotaciones nada. Por lo tanto, en su caso, se agregará una anotación para 'createPoint()', pero a menos que la clase objetivo tenga un método de fábrica coincidente (para agregar anotaciones), esto no tendrá ningún efecto. Específicamente, entonces, las mezclas no se pueden usar para inyectar métodos estáticos de fábrica; solo pueden usarse para asociar anotaciones con clases existentes.

+0

gracias mucho que tenga sentido, supongo que mi única opción es serializar todos los otros atributos necesarios _ (alrededor de 3 objetos más complejos :() _ para la clase de objetivo constructor y usarlos en la clase MixIn. ¿Estoy en lo cierto? – maverick

+0

Gracias de nuevo, finalmente terminé excluyendo el campo mientras deserialización ya que no es necesario. – maverick

+0

tener esto, o algo similar, sería increíblemente útil para la deserialización fácil de clases que no se puede modificar. Hay muchos casos en los que la deserialización general es demasiado difícil. – loesak

0

Intente utilizar @JsonIgnoreProperties({"isMilestoneView", "milestoneId"}) clase de nivel de anotación