2011-09-15 6 views
5

Aktualnie używam jacksona 1.7, który próbuje deserializować obiekt z biblioteki innej firmy.co jest nie tak z moją adnotacją @JsonCreator i MixIn?

Więc skonfigurować ObjectMapper użyć mojej klasy wstawek tak:

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

A moja klasa wstawek opatrzone @JsonCreator iz logiką tworzenia wystąpienia Punkt obiekt nie

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)); 
}} 

Ale otrzymuję wyjątek

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?) 

Debugowanie pokazuje, że moja klasa MixIn nigdy nie jest wywoływana, myślałem, że musi to być konkretna klasa, ale miała taki sam wynik.

Co robię źle? Co jest nie tak z moją konfiguracją?

Dzięki

Odpowiedz

6

Problem polega na założeniu, że mix-ins byłyby wykorzystywane do celów innych niż dodawanie adnotacji. W twoim przypadku zostanie dodana adnotacja o nazwie "createPoint()", ale jeśli klasa docelowa nie będzie miała dopasowanej metody fabrycznej (aby dodać adnotacje), nie będzie to miało żadnego efektu. W szczególności, mieszanie nie może być użyte do wstrzykiwania statycznych metod fabrycznych; można ich używać tylko do kojarzenia adnotacji z istniejącymi klasami.

+0

Bardzo dziękuję, że ma sens, myślę, że moją jedyną opcją jest serializacji te wszystkie inne atrybuty potrzebne _ (około 3 bardziej złożone obiekty :() _ dla klasy docelowej konstruktor i używaj ich w klasie MixIn, czy mam rację? – maverick

+0

Jeszcze raz dziękuję, w końcu zakończyłem wyłączenie pola podczas deserializacji, ponieważ nie jest już potrzebne. – maverick

+0

posiadanie tego lub coś podobnego byłoby niezwykle pomocne w łatwym deserializacji klas, które nie można modyfikować.Istnieje wiele przypadków ogólnej deserializacji jest po prostu zbyt trudne. – loesak

0

Spróbuj użyć @JsonIgnoreProperties({"isMilestoneView", "milestoneId"}) klasy poziom adnotacji