2016-12-19 2 views
1

私はディスク上のファイルからオブジェクトをマーシャリングできるように、サードパーティのクラス(google maps classes)のシリアル化メカニズムをオーバーライド/修正する必要があります。私は何をしようとしているのseveral examplesを見て、どれもうまくいかないようです。Jackson Mixin + creator not working

問題を抱えたクラス:

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

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

マイミックスイン

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

マーシャリングされるJSONの私の使い方

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

スニペット:

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

マイエラー

com.fasterxml.jackson.databind.JsonMappingException(/ミックスイン無しで):タイプが見つかりません適切な コンストラクタ[単純型、クラス com.google.maps.model.LatLng] :JSONオブジェクト からインスタンス化することはできません(デフォルトのコンストラクタまたは作成者の欠落、またはおそらく追加/ 型情報を有効にする必要がありますか?)

私が間違っている可能性がある場所、誰もが見ていますか?

+0

「ダブル」と「ダブル」の違いはすべて違います。 mixinクラスのコンストラクタでそれらを 'double'パラメータにしてください。 –

+0

また、 '@JsonCreator'は必要ではありません。 –

+0

@SotiriosDelimanolisは、クレジットを得るためにあなたのコメントを答えに変えます。それは旅行です。正直なところ、Googleからのこのクラス構造は非常に非友好的なので、私はマップとしてすべてをマーシャリングするかもしれないと思う –

答えて

1

ミックスインは、コンストラクタとメソッドのシグネチャが一致して機能します。あなたのミックスインコンストラクタが

public LatLnMixIn(Double lat, Double lng) 

として定義されている間、あなたのターゲットクラスのコンストラクタは

public LatLng(double lat, double lng) 

のように見えるジャクソンは、異なるタイプとしてdoubleDoubleを考慮し、したがって、ターゲットクラス内に一致するコンストラクタを見つけることができません。

doubleパラメータを使用するようにコンストラクタを変更するだけです。


@JsonCreatorこの特定の例では注釈は不要です。