2016-12-19 3 views
1

Ich muss den Serialisierungsmechanismus für eine Klasse von Drittanbietern (google maps classes) überschreiben/beheben, so dass ich die Objekte aus einer Datei auf der Festplatte marshallen kann. Ich habe gesehen, several examples von dem, was ich versuche zu tun und keiner von ihnen scheint zu arbeiten.Jackson Mixin + Ersteller funktioniert nicht

Die unruhige Klasse:

public class LatLng implements UrlValue { 
    public double lat; 
    public double lng; 

    public LatLng(double lat, double lng) { 
     this.lat = lat; 
     this.lng = lng; 
    } 
} 

Mein mixin

public abstract class LatLnMixIn { 
    @JsonCreator 
    public LatLnMixIn(@JsonProperty("lat") Double lat, @JsonProperty("lng ")Double lng) {} 
} 

Meine Nutzung

ObjectMapper mapper = new ObjectMapper().addMixIn(LatLng.class, LatLnMixIn.class); 
    InputStream mockStream = this.getClass().getResourceAsStream("/mz-to-nordstrom-rack-snoq.json"); 
    DirectionsResult mockResult = mapper.readValue(mockStream, DirectionsResult.class); 

Ausschnitt aus der json zu gemarshallte:

 "start_location" : { 
     "lat" : 47.5985728, 
     "lng" : -122.3315845 
     }, 

Mein Fehler (mit/ohne mixin)

com.fasterxml.jackson.databind.JsonMappingException: Kein geeigneten Konstruktor für Typen [einfache Art, Klasse com.google.maps.model.LatLng] gefunden : von JSON-Objekt nicht falsch instanziieren (fehlende Standardkonstruktors oder Schöpfer, oder vielleicht brauchen Typinformationen hinzufügen/aktivieren?)

Sieht jemand, wo ich gegangen könnte?

+0

Das 'Double' vs' double' macht den Unterschied. Machen Sie sie einfach im mixin-Konstruktor zu "double" -Parametern. –

+0

Auch sollte der '@ JsonCreator' nicht notwendig sein. –

+0

@SotiriosDelimanolis machen Sie Ihren Kommentar zu einer Antwort, um Kredit zu bekommen. Das ist die Reise. Ehrlich gesagt, ist diese Klassenstruktur von Google so unfreundlich, dass ich denke, dass ich alles als Karte einordnen kann –

Antwort

1

Mixins arbeiten mit übereinstimmenden Konstruktor- und Methodensignaturen. Ihr Ziel Klassenkonstruktors sieht aus wie

public LatLng(double lat, double lng) 

während mixin Konstruktor definiert als

public LatLnMixIn(Double lat, Double lng) 

Jackson hält double und Double als verschiedene Typen und daher keinen passenden Konstruktor in der Zielklasse findet.

Ändern Sie einfach Ihren Konstruktor, um double Parameter zu verwenden.


Die @JsonCreator Anmerkung ist in diesem speziellen Beispiel nicht notwendig.

Verwandte Themen