3

Java アプレットで Google Gson を使用しようとしていますが、使用すると

スレッド「Thread-19」の例外 java.security.AccessControlException: java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) で java.security.AccessController.checkPermission(( AccessController.java:546) で 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.com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:56) の constructTarget(JsonObjectDeserializationVisitor.java:40) 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. com.google.gson.Gson.fromJson(Gson.java:396) の Gson.fromJson(Gson.java:444) org.jblux.client の com.google.gson.Gson.fromJson(Gson.java:372) .network.GsonParser$1.run(GsonParser.java:32) at java.security.AccessController.doPrivileged(Native Method) at org.jblux.client.network.org.jblux.client.network.PlayerDataFactory.getDataFromBase64(PlayerDataFactory.java:36) の GsonParser.parseJson(GsonParser.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) でorg.jblux.client.network.ResponseWaiter.responseReceived(ResponseWaiter.java:33) の util.Observable.notifyObservers(Observable.java:142) 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) でorg.jblux.client.network.ResponseWaiter.responseReceived(ResponseWaiter.java:33) の util.Observable.notifyObservers(Observable.java:142) 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) で

ここで見つけた他の2つの関連する質問がありました。
アプレットで GSON ライブラリを使用すると、Google App Engine 上の GSON が Security Exception
Reflection Permission の問題をスローする

しかし、どちらも私には答えがありませんでした。Gsonを使用しないと言われました。
自分のアプレットに Reflection のアクセス許可を与える方法はありますか?

更新: アプレットを機能させる方法がわからなかったため、JNLP ファイルと Java Web Start を使用するようにアプリケーションを切り替えているところです。誰かがそれを理解する場合に備えて、この質問を開いたままにしますが、Gson をあきらめたくない場合は、JNLP を使用することが唯一の選択肢かもしれません。

4

3 に答える 3

2

カスタムデシリアライザーを使用してこの問題を解決しました。

タイムスタンプと double のリストの 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();

これが誰にも役立つことを願っています!

于 2011-04-08T22:04:32.817 に答える
0

@Chrizzzに加えて、JavaWebサーバーと符号なしアプレットの間で双方向のコマンドオブジェクト交換を行っています。そのため、アプレットコード内でGson toJson()とfromJson()の両方を使用しています。

署名されていないアプレットでの逆シリアル化とシリアル化の両方でセキュリティ例外がスローされ、カスタムシリアライザーとデシリアライザーを実装することでこれらの問題を回避できることがわかりました。

最大の問題は、単体テスト用のアプレット環境(SecurityManager)をエミュレートできないことです。これを行うために利用できるフレームワークがないようです。たとえば 、アプレットのSecurityManager内で実行されることが期待されるJavaコードを単体テストする方法を参照してください。

于 2012-12-20T17:16:03.927 に答える
0

ここで答えを見つけました。

System.setSecurityManager(null);

静的メインに追加すると役立ちました。もちろん、jnlp などのすべてのパーミッションが必要です。

于 2012-08-28T12:59:16.787 に答える