如何通过GSON传递JPA实体?

时间:2012-04-24 17:48:52

标签: java gson

我正在使用GSON将JPA Entity称为 Profile 从我的服务器传递给客户端

@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)

我需要做些什么来解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

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

至于如何解决它,你有两个选择:

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

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

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

答案 1 :(得分:1)

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