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

IIRC,当您从 EJB 检索对象时,它不是您定义的类,而是 JPA 创建的存根类(扩展您的类)。由于 GSON 使用反射(从而绕过提供的与您的类规范匹配的方法),它正在检索存根的内部元素(这不是您所期望的)。

您可以通过getClass()对检索到的对象进行检查来检查它。

至于如何解决,您有两种选择:

a) 通过复制 JPA 返回的对象来创建您的对象。

b)找到一种方法告诉 GSON 使用类方法而不是反射来检索数据(我不知道这种方法是否存在)。

我不知道是否有某种方法可以自动从 JPA 存根中检索内部对象。

于 2012-04-24T18:00:51.940 回答
1

geronimo-jpa_3.0_spec-1.1.1.jar(或您正在使用的实际版本)添加到您的 android libs 目录,并将其添加到项目类路径中。

于 2012-05-17T05:11:57.560 回答