我正在使用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)
我需要做些什么来解决这个问题?
答案 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目录,并将其添加到项目类路径中。