Java-апплет не может анализировать Json

Я разрабатываю веб-сервер в Django и на странице встраиваю Java-апплет.

Я должен передать этому апплету массив JSon в момент создания экземпляра. НИКАКИХ проблем вообще, я тестировал его в Eclipse без ошибок или проблем.

Большие проблемы возникли, когда я разместил это на веб-странице.

Сначала я попробовал с Jackson, вот код на странице:

  <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>

Код Java для разбора 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;
}

И вот ошибка, которую я получаю в консоли Java, когда пытаюсь использовать ее на веб-странице:

  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

Поэтому я подумал о какой-то странной проблеме с реализацией и попытался использовать 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='{{floors}}'>  
            MAYSCRIPT
    </applet>

И код Java:

  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;
}

Я не получаю никаких ошибок при запуске апплета в Eclipse, но когда я тестирую веб-страницу... я получаю другую ошибку:

  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)

Вот класс BaseFloor, который я пытаюсь разобрать, он находится в том же пакете статической функции:

  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;
      }
  }

А вот 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}]

Мне любопытно: это проблема моей реализации кода или проблема безопасности, потому что мой апплет не подписан, поэтому отражение нельзя использовать?

Если вам что-то нужно, спросите свободно.

Заранее спасибо.

ИЗМЕНИТЬ

Я попробовал то, что вы предложили @Nikita, и ошибка изменилась!

  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)

person Marco Fedele    schedule 24.11.2012    source источник
comment
.. или это проблема безопасности, потому что мой апплет не подписан, поэтому отражение нельзя использовать? Проверьте Консоль Java для вывода.   -  person Andrew Thompson    schedule 25.11.2012
comment
Исключение одинаковое в обоих случаях. Вы уверены, что вставили правильное сообщение для второго случая?   -  person Mikita Belahlazau    schedule 25.11.2012
comment
Вывод - ошибка, которую я обнаружил @Andrew   -  person Marco Fedele    schedule 25.11.2012


Ответы (1)


Попробуйте вставить запятую после {{STATIC_URL}}jar/plugin.jar на своей странице. Возможно, из-за этого java-плагин игнорирует jackson-annotations.jar, и вы получаете NoClassDefFoundError.
Вот аналогичный вопрос: NoClassDefFoundError JsonAutoDetect при синтаксическом анализе объекта JSON и отсутствие jackson-annotations вызвало проблему.

person Mikita Belahlazau    schedule 24.11.2012
comment
В каждом случае я решил создать функцию JS на странице, вызываемую JApplet, которая загружает данные JSON, анализирует их на месте и возвращает JSObject в JApplet. - person Marco Fedele; 25.11.2012