2013-04-07 10 views
7

私はJerseyを使用してエンティティをシリアル化しています。ジャクソン1.9から2.0に移行しています。私はthis guideに続き、最初はすべてが簡単にうまくいくように思えました。Jerseyの1.9からJackson 2.0へのアップグレードが動作しない

しかし、私の(マイグレーションされた)ジャクソン2.0注釈を無視して、ジャクソン1.9がまだ私の応答をシリアル化するために使用されていることを詳しく見ています。あなたが、私は以下のコードで使用していたの注釈を参照することができます

@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に削除し、jersey-jsonへの除外を追加して、Jackson 1.9を引き抜かないようにしました。しかし、私はJacksonの1.9が必要なSpring AMQPも使用しているため、(依存関係管理のすべてのcodehaus.jacksonに除外を加えることで)完全に取り除くことはできません。

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

答えて

8

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

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

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

第二は、2.1に私のジャクソンjaxrs-JSON-プロバイダを(実際には、私のジャクソンのすべての成果物)を更新しました。

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

2.0で、POJOMappingFeatureが削除されました。メッセージ本体のライターエラーが見つかりました。

2.1とPOJOMappingFeatureを削除すると、すべて正常に機能しました。

2

あなたのクラスパスに両方のバージョンのJacksonがないかどうかを再確認します。 Jackson 2.xのパッケージ名はcom.fasterxmlからorg.codehausに変更されました。このように、(NoClassDefFoundのような)暗黙的なクラスパスの問題はありませんが、適切なパッケージを使用しないと、これは表示される動作の種類です。

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

+0

いいえ、私はMavenを使用していると私は、それぞれのfasterxmlバージョンとすべてorg.codehausの成果物を置き換えます。私は[このガイド](http://www.cowtowncoder.com/blog/archives/2012/04/entry_469.html)を使って移行を行った。 – Eyal

+2

私はそれを理解しました。私が言っていることはおそらく別のプロジェクト(Jersey?)がJackson 1.xを推移的な依存関係としてクラスパスに追加し、おそらくJAX-RSプロバイダとして使用されるこのバージョンであるということです。私が正しくリコールすれば、プロジェクトとMavenとの依存関係を調べることが可能です。それを使うべきです。 –

+0

ジャージーは古いジャクソンの依存関係をもたらしますが、コンパイル時と思われるので、それが問題なのかどうかはわかりません。 – Eyal

5

Jacksonのコアとマッパーのバージョンを単純にアップグレードするだけでは不十分です。 Jersey(またはJAX-RS実装)とJacksonの統合は、特定のJAX-RSプロバイダを使用して行われます。 ジャクソンの場合、これはhttps://github.com/FasterXML/jackson-jaxrs-json-providerになります。

2.xジャクソンJAX-RS JSONプロバイダーを追加する必要があります.Jerseyがジャクソン2.xを動作させるようになります。

-1

あなたがjackson 2にアップグレードしても、古いjacksonを使用している春にNoClassfoundエラーが発生します。このリンク上の

チェック春の実装: http://git.springsource.org/sandbox/cbeams/blobs/4731d671cbeb82b87dd0f10e16cd09d8f267b433/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/json/MappingJacksonJsonView.java

+0

これはSpring MVC(あなたが投稿したリンクごと)に当てはまるかもしれませんが、私はそれを使用していません。他のSpringパッケージだけです。 – Eyal

関連する問題