2012-04-24 36 views
2

我傳遞JPA實體,稱爲檔案從我的服務器到客戶端使用GSON如何通過JPON實體與GSON?

@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

看起來像一個classpath的問題給我。您的序列化邏輯是否與您的實體位於不同的存檔中? – Perception 2012-04-24 17:58:36

+0

當然。我將Entity從客戶端傳遞到服務器,所以我需要把它放在某個地方。配置文件實體在服務器中,但我有從客戶端到服務器的claspasth。 – Rami 2012-04-24 18:04:47

+0

它看起來很奇怪,因爲未知的註解應該被默默地忽略。你使用哪種JRE? – axtavt 2012-04-24 18:25:13

回答

1

IIRC,當您從EJB檢索對象是你定義的,但一個存根類由JPA創建一個類(擴展類)不是。由於GSON使用反射(因此繞過了提供的方法,它符合您的類規範),它正在檢索存根的內部元素(這不是您所期望的)。

您可以通過執行檢索對象的getClass()檢查。

至於如何解決這個問題,你有兩個選擇:

一)通過複製JPA創建對象返回的對象。

b)找出一種方法來告訴GSON檢索使用類的方法,而不是反射數據(我不知道這樣的方式存在)。

我不知道是否有一些方法來自動從JPA存根內部對象。

+1

http://stackoverflow.com/questions/2216547/converting-hibernate-proxy-to-real-object – SJuan76 2012-04-24 18:14:29

1

geronimo-jpa_3.0_spec-1.1.1.jar(或實際您使用的版本)添加到您的Android庫目錄,並將其添加到項目的類路徑。

+0

這可能會解決問題,但它不應該是必要的使用任何JPA在客戶端的庫。 – andih 2012-05-17 05:26:55