Java:在Applet中使用Gson会导致SecurityException

时间:2010-10-03 17:46:27

标签: java gson securityexception

我正在尝试在我的Java Applet中使用Google Gson,但是当我这样做时,我会

  

线程“Thread-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)       在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)       在com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73)       在com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:51)       在com.google.gson.Gson.fromJson(Gson.java:495)       在com.google.gson.Gson.fromJson(Gson.java:444)       在com.google.gson.Gson.fromJson(Gson.java:396)       在com.google.gson.Gson.fromJson(Gson.java:372)       在org.jblux.client.network.GsonParser $ 1.run(GsonParser.java:32)       at java.security.AccessController.doPrivileged(Native Method)       在org.jblux.client.network.GsonParser.parseJson(GsonParser.java:36)       在org.jblux.client.network.PlayerDataFactory.getDataFromBase64(PlayerDataFactory.java:36)       在org.jblux.client.states.MainMenuState.update(MainMenuState.java:155)       在java.util.Observable.notifyObservers(Observable.java:142)       在org.jblux.client.network.ResponseWaiter.responseReceived(ResponseWaiter.java:33)       在org.jblux.client.network.ServerListener.notify_observers(ServerCommunicator.java:236)       在org.jblux.client.network.ServerListener.doCommand(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 有没有办法将反射权限授予我的applet?

更新:我正在将我的应用程序切换为使用JNLP文件和Java Web Start,因为我无法弄清楚如何使Applet工作。如果有人想出来的话我会留下这个问题,但如果你不想放弃Gson,使用JNLP可能是唯一的选择。

3 个答案:

答案 0 :(得分:2)

我使用自定义反序列化器解决了这个问题。

我有一个有两个成员的班级,一个时间戳和一个双打列表。这是适合我的代码。

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();

希望这可以帮助任何人!

答案 1 :(得分:0)

我找到了答案here

System.setSecurityManager(null);

添加到静态主要帮助我。当然,jnlp等中的所有权限必须是。

答案 2 :(得分:0)

继@Chrizzz之后,我正在Java Web服务器和未签名的applet之间进行双向命令对象交换。因此,我在我的applet代码中使用了Gson toJson()和fromJson()。

我发现无符号小程序中的反序列化和序列化都会引发安全异常,并且实现自定义序列化器和反序列化器可以解决这些问题。

最大的痛苦是无法模拟用于单元测试的applet环境(SecurityManager)。似乎没有可用于执行此操作的框架:请参阅例如 How to unit test Java code that is expected to run within an applet Security Manager