Java: использование Gson в апплете вызывает исключение SecurityException - PullRequest
2 голосов
/ 03 октября 2010

Я пытаюсь использовать Google Gson в своем Java-апплете, но когда я получаю

Исключение в потоке "Thread-19" java.security.AccessControlException: доступ запрещен (java.lang.reflect.ReflectPermission suppressAccessChecks) в java.security.AccessControlContext.checkPermission (AccessControlContext.java:323) в java.security.AccessController.checkPermission (AccessController.java:546) at java.lang.SecurityManager.checkPermission (SecurityManager.java:532) в 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 (собственный метод) в 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 в Google App Engine выдает исключение безопасности
Проблемы с разрешением отражения при использовании библиотеки GSON в апплете

Но ни у одного из них не было ответа для меня. Один только сказал, что не использует Gson.
Есть ли способ предоставить разрешение на рефлексию моему апплету?

Обновление: я нахожусь в процессе переключения моего приложения на использование файла JNLP и Java Web Start, потому что я не смог понять, как заставить Апплет работать. Я оставлю этот вопрос открытым на случай, если кто-нибудь выяснит это, но использование JNLP может быть единственным вариантом, если вы не хотите отказываться от Gson.

Ответы [ 3 ]

2 голосов
/ 09 апреля 2011

Я решил эту проблему, используя специальный десериализатор.

У меня был класс с двумя участниками, отметкой времени и списком двойников. Это код, который работал для меня.

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 голосов
/ 20 декабря 2012

В дополнение к @Chrizzz я делаю двухсторонний обмен объектами команды между веб-сервером Java и неподписанным апплетом.Поэтому в коде моего апплета я использую как Gson toJson (), так и fromJson ().

Я обнаружил, что как десериализация, так и сериализация в неподписанном апплете генерируют исключения безопасности и что реализация пользовательских сериализаторов и десериализаторов может работать- обойти эти проблемы.

Самая большая проблема - неспособность эмулировать среду апплета (SecurityManager) для модульного тестирования.Похоже, что для этого нет доступных фреймворков: см., Например, Как выполнить модульное тестирование кода Java, который должен запускаться в апплете Security Manager

0 голосов
/ 28 августа 2012

Я нашел ответ здесь .

System.setSecurityManager(null);

Помогло добавление к статическому основному.Конечно, все права доступа в jnlp и т. Д. Должны быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...