我正在尝试在我的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可能是唯一的选择。
答案 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)
答案 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