2011-02-07 9 views
0

私たちは、サーバーとクライアントアプリケーションに関連する共有クラスを(JAXB経由で)生成するためのxsdファイルだけを含んでいます。したがって、これらのクラスにはXMLアノテーションが含まれています。注釈を使用しないでJackson JSONプロセッサを使用する

1つのクライアントはAndroid Appです。また、私はJSON(Jersey/Jackson)を提供するRESTサービスと通信するので、ここではこれらのクラスをJSON逆シリアル化に使用したいと考えています。

私はこのようにAndroid上でJackson(バージョン1.7.2)を使用しよう:私はMAPPERは、アノテーションを使用しないでください設定したが、私はまだ

02-07 09:30:18.631: ERROR/AndroidRuntime(447): java.lang.NoClassDefFoundError: javax.xml.bind.annotation.XmlAccessorType 
02-07 09:30:18.631: ERROR/AndroidRuntime(447):  at java.lang.Class.getDeclaredAnnotations(Native Method) 
02-07 09:30:18.631: ERROR/AndroidRuntime(447):  at org.codehaus.jackson.map.introspect.AnnotatedClass.resolveClassAnnotations(AnnotatedClass.java:292) 
02-07 09:30:18.631: ERROR/AndroidRuntime(447):  at org.codehaus.jackson.map.introspect.AnnotatedClass.construct(AnnotatedClass.java:139) 

知っているを取得

ObjectMapper mapper = new ObjectMapper(); 
mapper = mapper.configure(DeserializationConfig.Feature.USE_ANNOTATIONS, 
       false); 
mapper = mapper.configure(SerializationConfig.Feature.USE_ANNOTATIONS, 
       false); 
FooBar someObject = (FooBar) mapper.readValue(jsonString, FooBar.class); 

Jacksonが注釈を解決するのを止めるトリック。

おかげ クラウス

+0

私はGsonの使い方がはるかに簡単で、JSONをオブジェクトに直接変換するためのPOJOオブジェクトの自動インスタンス化を行います。 – androidworkz

+1

Jacksonは完全なJSON-> POJO-> JSONデータバインディングを簡単に行うこともできます。だからGsonはどんな使い方で簡単に使えるでしょうか? – StaxMan

答えて

2

私の現在の調査は、これらの結果につながる:

(falseに設定)DeserializationConfig.Feature.USE_ANNOTATIONSプロパティの使用量がNopAnnotationIntrospectorを使用するJACKSON DeserializerConfigクラスの原因となります。クラスの注釈は、NopAnnotationIntrospectorを使用して解決されます。 NopAnnotationIntrospectorは、クラスの注釈の要求ごとにの要求ごとにfalseを返します。実際、この注釈は今後の処理では使用されません。

システムは、この場合、クラスパス上になければならない注釈をまだ "検査"しています。 Androidではjaxb-apiアノテーションが提供されていないため、NoClassDefFoundErrorにつながります。

私は、USE_ANNOTATIONS = falseがJACKSONにすべての注釈を完全に無視させると予想しましたが、残念ながらそれはありません。 JACKSONデータバインディング機能を使用する代わりに、JSON文字列を解析するためにJackson Streaming APIを使用します。

+0

使用しているBeanタイプにJAXBアノテーションが付いている問題がある場合は、これは意味があります。ジャクソン自体(コア、マッパー)はJAXB注釈型を参照しません。 "jackson-xc"(JAXB対応の注釈イントロスペクタを持つ)だけです。しかし、これは興味深い問題です:注釈の単純なアクセスが問題になることはわかりませんでした。結局のところ、注釈はバイトコードに直接含まれていたので、クラスロード中に問題が発生すると思いました。しかし、おそらく私は間違っています。注釈を読み込もうとすると問題になるだけですか?もしそうなら、これはジャクソンのRFEでしょうか? – StaxMan

+0

@StaxManアノテーションはgetが使用されていない(検査されていない)クラスパスになければ問題ありません。 USE_ANNOTATIONS = falseの場合に注釈を検査しないというジャクソンの変更要求はうまくいくでしょう。私は自分たちのシステムを考慮しておらず、この目的のためだけに作成することを躊躇しています。 – FrVaBe

+0

Ok;私はあなたのためにこれを追加することができます。JVM(またはJDK)が実際に注釈を「オンデマンド」で実際に読み込むのは興味深いことです。注釈が確認されていればそれが問題になると思います。私はちょうどすぐに積極的に読み込まれると思っていました。なぜなら、それをゆっくりと実行すると、あまり目立たない問題が生じることがありますが、同時にいくつかのケースで助けになるからです。 – StaxMan

0

Jacksonトランク(1.8.0より前)は、注釈処理を完全に無効にしようとするコード変更があります。理論的にはこれが問題を解決するはずです。 残念なことに、この問題は通常のJ2SE JVMではなく、Androidのみで発生します。ので、修正プログラムはAndroidで検証する必要があります。だから、Androidの開発者に問題が完全に解決されているかどうかを確認させるのは良いことです(そうでない場合は、もっと多くの作業が必要になります)。

関連する問題