2012-04-24 12 views
2

私はJPAエンティティを渡しているがGSONGSONでJPAエンティティを渡す方法は?

@Entity 
public class Profile implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    . 
    . 
    . 
} 

GSONコードを使用してクライアントへの私のサーバーからプロフィールと呼ば:

Gson gson = new Gson(); 
Profile profile = gson.fromJson(json, Profile.class); 

しかし、私は取得しています:

java.lang.NoClassDefFoundError: javax.persistence.Id 
java.lang.reflect.Field.getDeclaredAnnotations(Native Method) 
java.lang.reflect.Field.getDeclaredAnnotations(Field.java:188) 
java.lang.reflect.AccessibleObject.getAnnotations(AccessibleObject.java:188) 
java.lang.reflect.AccessibleObject.getAnnotation(AccessibleObject.java:196)        
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldName(ReflectiveTypeAdapt erFactory.java:60) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
com.google.gson.Gson.getAdapter(Gson.java:353) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
com.google.gson.Gson.getAdapter(Gson.java:353) 
com.google.gson.Gson.fromJson(Gson.java:754) 
com.google.gson.Gson.fromJson(Gson.java:721) 
com.google.gson.Gson.fromJson(Gson.java:670) 
com.google.gson.Gson.fromJson(Gson.java:642) 

私はこれを解決するために何をする必要がありますか?

+1

私にクラスパスの問題のように見えます。シリアル化ロジックはエンティティとは異なるアーカイブにありますか? – Perception

+0

もちろん。エンティティをクライアントからサーバーに前後に渡しているので、どこかに配置する必要があります。プロファイルエンティティはサーバーにありますが、クライアントからのサーバーへのclaspasthがあります。 – Rami

+0

未知の注釈を静かに無視する必要があるので、非常に奇妙に見えます。どのJREを使用していますか? – axtavt

答えて

1

IIRCでは、EJBからオブジェクトを取得するとき、それは定義したクラスではなく、JPAによって作成された(クラスを拡張する)スタブクラスです。 GSONはリフレクションを使用しているので(提供されているメソッドをバイパスして、クラスの仕様に合っています)、スタブの内部要素を取得しています(期待どおりではありません)。

検索されたオブジェクトのgetClass()を実行すると確認できます。

それを解決する方法については、次の2つのオプションがあります:

a)をJPA返されたオブジェクトをコピーしてオブジェクトを作成します。

b)GSONに、リフレクションではなくクラスメソッドを使用してデータを取得するように指示する方法を探します(そのような方法が存在するかどうかわかりません)。

JPAスタブから内部オブジェクトを自動的に取得する方法があるかどうかわかりません。

+1

http://stackoverflow.com/questions/2216547/converting-hibernate-proxy-to-real-object – SJuan76

1

android libsディレクトリにgeronimo-jpa_3.0_spec-1.1.1.jar(または使用している実際のバージョン)を追加して、プロジェクトクラスパスに追加します。

+0

それは問題を解決するかもしれませんが、JPAを使用する必要はありませんクライアント側のlibs。 – andih

関連する問題