2

GSONを使用して、 Profileという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)

これを修正するにはどうすればよいですか?

4

2 に答える 2

1

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

于 2012-05-17T05:11:57.560 に答える
1

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

getClass()取得したオブジェクトを実行することで確認できます。

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

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

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

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

于 2012-04-24T18:00:51.940 に答える