7

ジャクソン (ジャージー) を使用してエンティティをシリアル化し、Jackson 1.9 から 2.0 に移行しています。私はこのガイドに従いましたが、最初はすべてが簡単にうまくいったように見えました.

しかし、よく見ると、Jackson 1.9 がまだ私の応答をシリアル化するために使用されていることがわかります。したがって、私の (移行された) Jackson 2.0 注釈は無視されます。次のコード フラグメントで、使用している注釈を確認できます。

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public abstract class IdEntity {

@Id
@JsonDeserialize(using = ObjectIdJsonDeserializer.class)
protected ObjectId id;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonSerialize(using = ObjectIdJsonSerializer.class)
public ObjectId getId() {
    return id;
}

public void setId(ObjectId id) {
    this.id = id;
}

@JsonIgnore
public String getIdAsString() {
    return id == null ? "" : id.toString();
}

@JsonIgnore ゲッターがシリアル化され、ObjectIdJsonSerializer が ObjectId フィールドに使用されていません。

デバッグでは、使用されている ObjectMapper が 1.9 のものであることがわかります。

Jackson 1.9 への Maven の直接的な依存関係をすべて削除し、jersey-json に除外を追加して、Jackson 1.9 が取り込まれないようにしました。しかし、Jackson 1.9 を必要とする Spring AMQP も使用しているため、依存関係管理ですべての codehaus.jackson を除外することによって、それを完全に取り除くことはできません。

これを管理する方法についてのアイデアはありますか? 誰かが同様の問題に遭遇/解決しましたか? Jersey に Jackson 2.0 を強制的に使用させるにはどうすればよいですか?

4

4 に答える 4

8

StaxMan と pgelinas からの(有用な)回答に基づいて、私は自分の質問に答えています。

それを機能させるために、私は2つのことをしなければなりませんでした。

最初に、web.xml からcom.sun.jersey.api.json.POJOMappingFeatureを削除しました。

2 つ目は、私のjackson-jaxrs-json-provider (実際には、すべての Jackson アーティファクト) を2.1に更新することでした。

2.1 または 2.0、および POJOMappingFeature では、Jackson 1.9 がまだシリアル化に使用されていました。

2.0 で POJOMappingFeature を削除すると、メッセージ本文ライターが見つからないというエラーが発生しました。

2.1 と POJOMappingFeature を削除すると、すべてが期待どおりに機能しました。

于 2013-04-11T12:15:43.087 に答える
2

クラスパスに両方のバージョンの Jackson がないかどうかを再確認します。com.fasterxmlJackson 2.x のパッケージ名はからに変更されましたorg.codehaus。このようにして、不可解なクラスパスの問題 ( などNoClassDefFound) は発生しませんが、適切なパッケージを使用しないと、このような動作が見られます。

また、注釈は独自のプロジェクトjackson-annotationsに抽出されました。

于 2013-04-08T14:01:54.380 に答える