Java:在Applet中使用Gson会导致SecurityException [英] Java: Using Gson in an Applet causes SecurityException

查看:186
本文介绍了Java:在Applet中使用Gson会导致SecurityException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在我的Java Applet中使用Google Gson,但是当我这样做时,我得到了

I'm trying to use Google Gson in my Java Applet, but when I do I get


19\" java.security.AccessControlException:访问被拒绝(java.lang.reflect.ReflectPermission suppressAccessChecks)
处java.security.AccessController java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
。 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.cons tructTarget(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)
at com.google.gson.Gson.fromJson(Gson.java:372)
at org.jblux.client.network.GsonParser $ 1.run(GsonParser.java:32)
在java.security.AccessController.doPrivileged(本地方法)
在org.jblux.client.network.GsonParser.parseJson(GsonParser.java:36)
在org.jblux.client。 network.PlayerDataFactory.g etDataFromBase64(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)

Exception in thread "Thread-19" java.security.AccessControlException: access denied (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) at com.google.gson.MappedObjectConstructor.getNoArgsConstructor(MappedObjectConstructor.java:85) at com.google.gson.MappedObjectConstructor.constructWithNoArgConstructor(MappedObjectConstructor.java:62) at com.google.gson.MappedObjectConstructor.construct(MappedObjectConstructor.java:53) at com.google.gson.JsonObjectDeserializationVisitor.constructTarget(JsonObjectDeserializationVisitor.java:40) at com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:56) at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:109) at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73) at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:51) at com.google.gson.Gson.fromJson(Gson.java:495) at com.google.gson.Gson.fromJson(Gson.java:444) at com.google.gson.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) at java.security.AccessController.doPrivileged(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.jblux.client.network.ResponseWaiter.responseReceived(ResponseWaiter.java:33) at org.jblux.client.network.ServerListener.notify_observers(ServerCommunicator.java:236) at org.jblux.client.network.ServerListener.doCommand(ServerCommunicator.java:252) at org.jblux.client.network.ServerListener.run(ServerCommunicator.java:218)

我在这里找到了另外两个相关的问题:




反射许可问题ems在applet中使用GSON库时

There were two other related questions I found here.
GSON on Google App Engine throws a Security Exception
Reflection Permission problems when using the GSON library in a applet

但是他们都没有给我答案。有人说不使用Gson。

有什么办法可以给我的applet授予反射许可?

But neither of them had an answer for me. One just said to not use Gson.
Is there any way to grant Reflection permission to my applet?

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

Update: I'm in the process of switching my application to use JNLP file and Java Web Start because I haven't been able to figure out how to make the Applet work. I'll leave this question open in case anybody figures it out, but using a JNLP may be the only option if you don't want to give up Gson.

推荐答案

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

I solved this problem using a custom deserializer.

我有一个包含两个成员的类,一个时间戳和一个双精度列表。这是我工作的代码。

I had a class with two members, a timestamp and a list of doubles. This is the code that worked for me.

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

希望这可以帮助任何人!

Hope this can help anyone!

这篇关于Java:在Applet中使用Gson会导致SecurityException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆