Java Applet无法解析Json [英] Java Applet cannot parse Json

查看:473
本文介绍了Java Applet无法解析Json的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Django开发一个Web服务器,在一个页面中嵌入了一个Java Applet。



我必须将这个applet传递给一个JSon数组实例化的时刻。没有问题,我已经在Eclipse中测试过,没有任何错误或问题。



当我把这个放在网页上时,大问题出现了。 >

首先我尝试了杰克逊,这里是代码页面:

 < applet name =mapGenerator
id =mapGenerator
code = main.MapGenerator.class
archive ={{STATIC_URL}} jar / MapGenerator.jar,
{{STATIC_URL}} jar / plugin.jar
{{STATIC_URL}} jar / jackson -annotations-2.1.1.jar,
{{STATIC_URL}} jar / jackson-core-2.1.1.jar,
{{STATIC_URL}} jar / jackson-databind-2.1.1.jar
>
< param name = id value ={{building.id}}>
< param name = piani value ='{{floor}}'>
MAYSCRIPT
< / applet>

解析Json的Java代码:

  public static Floor [] parse(String input,URL codebase){

ObjectMapper mapper = new ObjectMapper(); //可以重用,共享全局
BaseFloor [] bfloors = null;

try {
bfloors = mapper.readValue(input,BaseFloor []。class);
} catch(JsonParseException e){
// TODO自动生成的catch块
e.printStackTrace();
} catch(JsonMappingException e){
// TODO自动生成的catch块
e.printStackTrace();
} catch(IOException e){
// TODO自动生成的catch块
e.printStackTrace();
}
for(int i = 0; i< bfloors.length; i ++){

楼f = new Floor(bfloors [i]);
f.setCodeBase(codebase);
floor [i] = f;
}
返回楼层;
}

这里是我尝试使用Java控制台时出现的错误在网页中使用它:

 线程中的异常thread applet-main.MapGenerator.class-1java.lang。 noClassDefFoundError:com / rapidxml / jackson / annotation / JsonAutoDetect 
at com.fasterxml.jackson.databind.introspect.VisibilityChecker $ Std。< clinit>(VisibilityChecker.java:172)
at com.fasterxml。 jackson.databind.ObjectMapper。< clinit>(ObjectMapper.java:195)
在objects.Floor.parse(Floor.java:37)
在main.MapGenerator.loadParameters(MapGenerator.java:67 )
在main.MapGenerator.start(MapGenerator.java:31)
at sun.plugin2.applet.Plugin2Manager $ AppletExecutionRunnable.run(Plugin2Manager.java:1698)
在java.lang。 Thread.run(Thread.java:662)
导致:java.lang.ClassNotFoundException:com.fasterxml.jackson.annotation.JsonAutoDetect
at sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java :252)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Plugin2ClassLoader.java:250)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:180)
at sun.plugin2。 applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:161)
在java.lang.ClassLoader.loadClass(ClassLoader.java:247)
...另外

所以我想到一些奇怪的实现问题,我试过使用 google-gson



以前这里是网页代码:

 < applet name =mapGenerator
id =mapGenerator
code =main.MapGenerator.class
archive ={{STATIC_URL}} jar / MapGenerator.jar,
{{STATIC_URL}} jar / gson-2.2.2.jar,
{{STATIC_URL}} jar / plugin.jar
>
< param name = id value ={{building.id}}>
< param name = piani value ='{{floor}}'>
MAYSCRIPT
< / applet>

而Java代码:

  public static Floor [] parse(String input,URL codebase){

Gson gson = new Gson();

BaseFloor [] bfloors = gson.fromJson(input,BaseFloor []。class);

楼层[]楼层=新楼[bfloors.length]; (int i = 0; i< bfloors.length; i ++){

floor f = new Floor(bfloors [i]);


f.setCodeBase(codebase);
floor [i] = f;
}
返回楼层;
}

我没有在Eclipse上运行applet的任何错误,但是当我在网页上测试...我收到另一个错误:

  java.security.AccessControlException:access denied(java.lang .reflect.ReflectPermission suppressAccessChecks)
在java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
在java.security.AccessController.checkPermission(AccessController.java:546)
在java .lang.SecurityManager.checkPermission(SecurityManager.java:532)
在java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:107)
在com.google.gson.internal.ConstructorConstructor.newDefaultConstructor (ConstructorConstructor.java:84)
com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:66)
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory .java:71)
在com.google.gson.Gson.getAdapter(Gson.java:353)
com.google.gson.internal.bind.ArrayTypeAdapter $ 1.create(ArrayTypeAdapter.java:48)
com.google.gson.Gson.getAdapter(Gson.java:353)
at com .google.gson.Gson.fromJson(Gson.java:794)
在com.google.gson.Gson.fromJson(Gson.java:761)
在com.google.gson.Gson.fromJson (Gson.java:710)
在com.google.gson.Gson.fromJson(Gson.java:682)
在objects.Floor.parse(Floor.java:33)
at main.MapGenerator.loadParameters(MapGenerator.java:67)
在main.MapGenerator.start(MapGenerator.java:31)
at sun.plugin2.applet.Plugin2Manager $ AppletExecutionRunnable.run(Plugin2Manager.java: 1698)
在java.lang.Thread.run(Thread.java:662)
Eccezione:java.security.AccessControlException:access denied(java.lang.reflect.ReflectPermission suppressAccessChecks)

这是我正在分析的tryng的类 BaseFloor ,它在同一个包静态功能:

 包装对象; 


public class BaseFloor {

public int numero_di_piano;
public String link;
public String bearing;

public float getBearing(){
return Float.parseFloat(bearing);
}

public int getFloor(){
return numero_di_piano;
}

public String getLink(){
return link;
}

public String toString(){
return numero_di_piano ++轴承++链接;
}
}

这里是传递给我的JSON小程序:

  [{bearing:354.00,link:/ media / floors / Foto_del_63333991-02 -2455618_alle_17_35_6.jpg,numero_di_piano:0},{bearing:354.00,link:/media/floors/IMG_20111009_171138_7.jpg,numero_di_piano:1}] 

我很好奇:我的代码执行问题,还是安全问题,因为我的小程序没有签名,所以反射不能使用?



如果你需要的东西,请自由地问。



谢谢你提前。



编辑



尼基塔,错误改变了!

  java.security.AccessControlException:访问被拒绝(java.lang.RuntimePermission accessDeclaredMembers)
在java.security.AccessControlContext .checkPermission(AccessControlContext.java:374)
在java.security.AccessController.checkPermission(AccessController.java:546)
在java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
在java.lang.SecurityManager.checkMemberAccess(SecurityManager.java:1662)
在java.lang.Class.checkMemberAccess(Class.java:2157)
在java.lang.Class.getDeclaredMethods(Class。 java:1790)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass._addMemberMethods(AnnotatedClass.java:593)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass.resolveMemberMethods(AnnotatedClass。 java:421)
在com.fasterxml.jackson.databind.introspect.AnnotatedClass.memberMethods(AnnotatedClass.java:243)
在com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addMethods(POJOPropert iesCollector.java:442)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collect(POJOPropertiesCollector.java:232)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.collectProperties( BasicClassIntrospector.java:142)
在com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(BasicClassIntrospector.java:81)
在com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization( BasicClassIntrospector.java:11)​​
在com.fasterxml.jackson.databind.DeserializationConfig.introspect(DeserializationConfig.java:507)
在com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache。 java:326)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache。 java:244)
在com.fasterxml.jackson.databind.des er.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)
在com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:342)
在com.fasterxml.jackson.databind.ObjectMapper。 _findRootDeserializer(ObjectMapper.java:2898)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2792)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper。 java:1942)
在objects.Floor.parse(Floor.java:40)
在main.MapGenerator.loadParameters(MapGenerator.java:67)
在main.MapGenerator.start(MapGenerator .java:31)
at sun.plugin2.applet.Plugin2Manager $ AppletExecutionRunnable.run(Plugin2Manager.java:1698)
在java.lang.Thread.run(Thread.java:662)
Eccezione:java.security.AccessControlException:access denied(java.lang.RuntimePermission accessDeclaredMembers)


解决方案

尝试在 {{STATI C_URL}}你的页面中的jar / plugin.jar 可能是java插件忽略jackson-annotations.jar因为这样,你得到 NoClassDefFoundError

这是一个类似的问题: NoClassDefFoundError在解析JSON对象时出现JsonAutoDetect ,并且缺少 jackson-annotations 导致了问题。


I'm developing a web server in Django, and in a page, I embed a Java Applet.

I have to pass to this applet a JSon array at the moment of instantiation. NO problems at all, I've tested it in Eclipse with no errors or problems.

The big problems came out when I put this on the web page.

First I tried with Jackson, here is the code on the page:

  <applet name="mapGenerator"
            id="mapGenerator"  
            code="main.MapGenerator.class"
            archive="{{STATIC_URL}}jar/MapGenerator.jar, 
                            {{STATIC_URL}}jar/plugin.jar
                            {{STATIC_URL}}jar/jackson-annotations-2.1.1.jar,
                            {{STATIC_URL}}jar/jackson-core-2.1.1.jar,
                            {{STATIC_URL}}jar/jackson-databind-2.1.1.jar"
                     >
                    <param name=id value="{{building.id}}">
                    <param name=piani value='{{floors}}'>  
            MAYSCRIPT
    </applet>

The Java code for parsing the Json:

  public static  Floor[] parse(String input, URL codebase) {

        ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
    BaseFloor[] bfloors=null;

        try {
              bfloors = mapper.readValue(input, BaseFloor[].class);
    } catch (JsonParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JsonMappingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
          for (int i=0; i < bfloors.length; i++) {

        Floor f = new Floor(bfloors[i]);
        f.setCodeBase(codebase);
        floors[i] = f;
    }
    return floors;
}

And here it's the error that I get in the Java console when I try to use it in the web page:

  Exception in thread "thread applet-main.MapGenerator.class-1" java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonAutoDetect
at com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit>(VisibilityChecker.java:172)
at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(ObjectMapper.java:195)
at objects.Floor.parse(Floor.java:37)
at main.MapGenerator.loadParameters(MapGenerator.java:67)
at main.MapGenerator.start(MapGenerator.java:31)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1698)
at java.lang.Thread.run(Thread.java:662)
  Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonAutoDetect
at sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java:252)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Plugin2ClassLoader.java:250)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:180)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:161)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 7 more

So I tought about some strange implementation problem, and I tried with google-gson

As before here is the web page code:

   <applet name="mapGenerator"
            id="mapGenerator"  
            code="main.MapGenerator.class"
            archive="{{STATIC_URL}}jar/MapGenerator.jar, 
                            {{STATIC_URL}}jar/gson-2.2.2.jar,
                            {{STATIC_URL}}jar/plugin.jar
                     >
                    <param name=id value="{{building.id}}">
                    <param name=piani value='{{floors}}'>  
            MAYSCRIPT
    </applet>

And the Java code:

  public static  Floor[] parse(String input, URL codebase) {

    Gson gson = new Gson();

    BaseFloor[] bfloors = gson.fromJson(input, BaseFloor[].class);

    Floor[] floors = new Floor[bfloors.length];

    for (int i=0; i < bfloors.length; i++) {

        Floor f = new Floor(bfloors[i]);
        f.setCodeBase(codebase);
        floors[i] = f;
    }
    return floors;
}

I don't get any error running the applet on Eclipse, but when I go testing on a web page... I get another error:

  java.security.AccessControlException: access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:107)
at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:84)
at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:66)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:71)
at com.google.gson.Gson.getAdapter(Gson.java:353)
at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48)
at com.google.gson.Gson.getAdapter(Gson.java:353)
at com.google.gson.Gson.fromJson(Gson.java:794)
at com.google.gson.Gson.fromJson(Gson.java:761)
at com.google.gson.Gson.fromJson(Gson.java:710)
at com.google.gson.Gson.fromJson(Gson.java:682)
at objects.Floor.parse(Floor.java:33)
at main.MapGenerator.loadParameters(MapGenerator.java:67)
at main.MapGenerator.start(MapGenerator.java:31)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1698)
at java.lang.Thread.run(Thread.java:662)
  Eccezione: java.security.AccessControlException: access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)

Here is the class BaseFloor that I'm tryng to parse, it's in the same package of the static function:

  package objects;


  public class BaseFloor {

      public int numero_di_piano;
      public String link;
      public String bearing;

      public float getBearing() {
    return Float.parseFloat(bearing);
      }

      public int getFloor() {
    return numero_di_piano;
      }

      public String getLink() {
    return link;
      }

      public String toString() {
    return numero_di_piano + " " + bearing + " " + link;
      }
  }

And here is the JSON that I'm passing to the applet:

  [{"bearing": "354.00", "link": "/media/floors/Foto_del_63333991-02-2455618_alle_17_35_6.jpg", "numero_di_piano": 0}, {"bearing": "354.00", "link": "/media/floors/IMG_20111009_171138_7.jpg", "numero_di_piano": 1}]

I'm curious: is it a problem of my implementation of the code, or is it a problem of security, because my applet isn't signed so the reflection cannot be used?

If you need something, ask freely.

Thank you in advance.

EDIT

I've tried what you suggested @Nikita, and the error changed!

  java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkMemberAccess(SecurityManager.java:1662)
at java.lang.Class.checkMemberAccess(Class.java:2157)
at java.lang.Class.getDeclaredMethods(Class.java:1790)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass._addMemberMethods(AnnotatedClass.java:593)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass.resolveMemberMethods(AnnotatedClass.java:421)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass.memberMethods(AnnotatedClass.java:243)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addMethods(POJOPropertiesCollector.java:442)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collect(POJOPropertiesCollector.java:232)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.collectProperties(BasicClassIntrospector.java:142)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(BasicClassIntrospector.java:81)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(BasicClassIntrospector.java:11)
at com.fasterxml.jackson.databind.DeserializationConfig.introspect(DeserializationConfig.java:507)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:326)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:342)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:2898)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2792)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
at objects.Floor.parse(Floor.java:40)
at main.MapGenerator.loadParameters(MapGenerator.java:67)
at main.MapGenerator.start(MapGenerator.java:31)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1698)
at java.lang.Thread.run(Thread.java:662)
  Eccezione: java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)

解决方案

Try to insert comma after {{STATIC_URL}}jar/plugin.jar in your page. May be java plugin ignores jackson-annotations.jar because of this and you get NoClassDefFoundError.
Here is a similar question: NoClassDefFoundError JsonAutoDetect while parsing JSON object and missing jackson-annotations caused the problem.

这篇关于Java Applet无法解析Json的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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