2011-09-15 2 views
5

現在、jackson 1.7を使用して、サードパーティのライブラリからオブジェクトを逆シリアル化しようとしています。@JsonCreatorとMixInアノテーションで何が問題になっていますか?

だから私はこのように私のミックスインクラスを使用するために私のObjectMapperを設定します。

ポイントオブジェクトをインスタンス化する @JsonCreatorとし、ロジックで注釈が付け

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

そして、私のmixinクラス

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

しかし例外が発生しています

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

デバッグは、私のMixInクラスが呼び出されないことを示しています。具体的なクラスにする必要があると思っていましたが、同じ結果でした。

私は間違っていますか?私の設定で何が問題になっていますか?

おかげ

答えて

6

問題は、ミックスインは注釈を追加する以外の目的で使用されることを前提としています。したがって、あなたの場合、 'createPoint()'の注釈が追加されますが、ターゲットクラスに(注釈を追加するための)ファクトリメソッドが一致しない限り、これは何の効果もありません。 具体的には、mix-insを使用して静的ファクトリメソッドを挿入することはできません。アノテーションを既存のクラスと関連付けるためにのみ使用できます。

+0

おかげで理にかなっている多く@JsonIgnoreProperties({"isMilestoneView", "milestoneId"}) クラスレベルアノテーションを使用してみてください、私は私の唯一のオプションは、(:(3つの、より複雑なオブジェクトの周り)_必要なすべてのものを他の属性をシリアル化するためにあることを推測_ターゲットクラスのためにコンストラクタを使用してMixInクラスで使用してください。 – maverick

+0

デシリアライズ中にフィールドを除外して終了しました。これ以上不要なので、最後にフィールドを除外しました。 – maverick

+0

これを持つ、または類似のクラスを簡単に直列化できます – loesak

0

関連する問題