2010-10-03 54 views
2

我嘗試使用谷歌GSON在我的Java小程序,但是當我做我得到線程Java的:在一個Applet使用GSON導致拋出:SecurityException

異常「主題-19」 java.security.AccessControlException :訪問被拒絕(java.lang.reflect.ReflectPermission suppressAccessChecks) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang .SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:74) 在com.google.gson.MappedObjectConstructor.getNoArgsConstructor(MappedObjectConstructor.java:85) 在com.google.gson.MappedObjectConstructor.constructWithNoArgConstructor(MappedObjectConstructor.java:62) 在com.google.gson.MappedObjectConstructor.construct(MappedObjectConstructor。的java:53) 在com.google.gson.JsonObjectDeserializationVisitor.constructTarget(JsonObjectDeserializationVisitor.java:40) 在com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:56) 在com.google.gson.ObjectNavigator。 accept(ObjectNavigator.java:109) at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73) at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextD (com.google.gson.Gson.fromJson(Gson.java:495) com.google.gson.Gson.fromJson(Gson.java:444) com.google.gson)上的efault.java:51) 。 Gson.fromJson(Gson.java:396) at com.google.gson.Gson.fromJson(Gson.java:372) at org.jblux.client.network.GsonParser $ 1.run(GsonParser.java:32) (Native Method) at org.jblux.client.network.GsonParser.parseJson(GsonParser.java:36) at org.jblux.client.network.PlayerDataFactory.getDataFromBase64(PlayerDataFactory.java: 36) at org.jblux.client.states.MainMenuState.update(MainMenuState.java:155) at java.util.Observable.notifyObservers(Observable.java:142) at org.jb在org.jblux.client.network.ServerListener.notify_observers(ServerCommunicator.java:236) 處, ServerCommunicator.java:252) 在org.jblux.client.network.ServerListener.run(ServerCommunicator.java:218)

有,我發現這裏有兩個其他相關問題。
GSON on Google App Engine throws a Security Exception
Reflection Permission problems when using the GSON library in a applet

但他們都沒有回答我。有人說不使用Gson。
有什麼辦法可以給我的小程序授予反射許可?

更新:我正在切換我的應用程序以使用JNLP文件和Java Web Start,因爲我一直無法弄清楚如何使Applet工作。如果有人提出這個問題,我會留下這個問題,但如果你不想放棄Gson,使用JNLP可能是唯一的選擇。

+1

第二個相關問題的答案之一建議簽署applet或執行'PrivilegedAction'。你嘗試了其他嗎? – BalusC 2010-10-03 17:50:31

+0

是的,我的小程序一直在簽名,我嘗試了PrivelagedAction的事情,但沒有奏效。 PrivelagedAction甚至出現在我發佈的回溯中。 – jonescb 2010-10-03 18:29:29

+0

在堆棧跟蹤的後面有一個對setAccessible的調用。你的無參數構造函數的可見性是什麼?如果還沒有,請嘗試將其設置爲公開,以查看是否讓你過去。如果已經公開,可能需要向GSON人士提交錯誤信息,以便在可見時不更改可訪問性。 – Carl 2010-10-03 20:25:51

回答

1

我使用自定義解串器解決了這個問題。

我有一個班,有兩個成員,一個時間戳和一個雙打列表。這是爲我工作的代碼。

GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(TimestampedValueList.class, new JsonDeserializer<TimestampedValueList>() { 
     @Override 
     public TimestampedValueList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
      long timestampMs = json.getAsJsonObject().get("timestampMs").getAsLong(); 
      double[] valueList = context.deserialize(json.getAsJsonObject().get("valueList"), double[].class); 
      return new TimestampedValueList(timestampMs, valueList); 
     } 
    }); 
gson = gsonBuilder.create(); 

希望這可以幫助任何人!

0

我找到了答案here

System.setSecurityManager(null); 

添加到靜態主幫助我。當然,jnlp等中的所有權限必須是。

0

除了@Chrizzz,我正在做一個Java Web服務器和一個未簽名的小程序之間的雙向命令對象交換。因此,我在我的小程序代碼中使用了Gson toJson()和fromJson()。

我發現無符號小程序中的反序列化和序列化都會拋出安全異常,並且實現自定義序列化器和反序列化器可以解決這些問題。

最大的困難是無法模擬單元測試的applet環境(SecurityManager)。看起來沒有框架可以做到這一點:參見例如 How to unit test Java code that is expected to run within an applet Security Manager

相關問題