Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка парсинга XML в апплете. Помогите разобраться в причине, плз. 
V
    Опции темы
Real McCoy
Дата 22.11.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: нет
Всего: 2



Здравствуйте все!

Странно ведёт себя апплет, и я никак не могу разобраться, в чём тут дело. Буду весьма благодарен за помощь.

Есть апплет с Java 3D, у него есть класс, который грузит и парсит XML-файл, лежащий на том же сервере, что и апплет. Так вот, Java 3D апплет можно запускать в двух окружениях:
1) запустить апплет, как и любой другой, но имея на клиентской машине установленный Java 3D.
2) запустить апплет используя специально предназначенный апплет JNLPAppletLauncher, на клиентской машине, где не установлен Java 3D. Ланчер из-под себя запускает 3д-апплет, подтягивая необходимые dll-ки и либы.

XML грузится и парсится самым простым способом:

Код

// .....
    URL dataURL = new URL(dataUrl);
    URLConnection connection = dataURL.openConnection();
    InputStream stream = connection.getInputStream();
    Document document = this.parseInputStream(stream); // XMLProcessor.java:44
    NodeList dataList = document.getDocumentElement().getChildNodes();
// ......

  private static Document parseInputStream(InputStream stream)
  {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // XMLProcessor.java:75
    factory.setValidating(false);
    factory.setNamespaceAware(true);
    factory.setIgnoringElementContentWhitespace(true);

    Document document = null;

    try
    {
      DocumentBuilder builder = factory.newDocumentBuilder();
      document = builder.parse(stream);
    }
    catch(Exception ex)
    {
    }

    return document;
  }



Так вот, проблема в том, что когда я запускаю апплет из-под JNLPAppletLauncher - всё работает прекрасно, а если запускаю его отдельно от всего на машине с Java 3D, получаю ошибку такого типа:
Код

java.lang.NoClassDefFoundError: IllegalName: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
at java.lang.ClassLoader.preDefineClass(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at sun.applet.AppletClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at javax.xml.parsers.FactoryFinder.getProviderClass(Unknown Source)
at javax.xml.parsers.FactoryFinder.newInstance(Unknown Source)
at javax.xml.parsers.FactoryFinder.findJarServiceProvider(Unknown Source)
at javax.xml.parsers.FactoryFinder.find(Unknown Source)
at javax.xml.parsers.DocumentBuilderFactory.newInstance(Unknown Source)
at com.orbotech.chart3d.XMLProcessor.parseInputStream(XMLProcessor.java:75)
at com.orbotech.chart3d.XMLProcessor.<init>(XMLProcessor.java:44)
at com.orbotech.chart3d.DataProcessor.loadData(DataProcessor.java:29)
at com.orbotech.chart3d.ChartApplet.init(ChartApplet.java:64)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)


т.е. выглядит таким образом, будто ошибку бросает вызов DocumentBuilderFactory.newInstance(). Почему? И почему работает из-под ланчера?

ChartApplet.java - это мой апплет, XMLProcessor.java - это модуль, который парсит xml.

Спасибо!
PM MAIL   Вверх
Real McCoy
Дата 22.11.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: нет
Всего: 2



У меня тут врезультате изучения проблемы возникло лёгкое подозрение в том, где порылась собака... Но всё равно прошу помощи.

Сравнивал поведение апплета при загрузке с локального Апача (работает) и с удалённого веб-сервера (не работает). Когда в консоли Java постваил trace level = 5, то в месте, где происходит чтение и обработка XML увидел следующее:

Лог с удалённого веб-сервера
Код

network: Cache entry not found [url: http://xxxxxxxxx.110mb.com/java/data.xml, version: null]
network: Connecting http://xxxxxxxxx.110mb.com/java/data.xml with proxy=DIRECT
network: Cache entry not found [url: http://xxxxxxxxx.110mb.com/java/META-INF/services/javax.xml.parsers.DocumentBuilderFactory, version: null]
network: Connecting http://xxxxxxxxx.110mb.com/java/META-INF/services/javax.xml.parsers.DocumentBuilderFactory with proxy=DIRECT
network: Cache entry not found [url: http://www.110mb.com/404.php, version: null]
network: Connecting http://www.110mb.com/404.php with proxy=DIRECT


Лог с локального Апача
Код

network: Cache entry found [url: http://java.local:8080/data.xml, version: null]
network: Connecting http://java.local:8080/data.xml with proxy=DIRECT
network: ResponseCode for http://java.local:8080/data.xml : 304
network: Encoding for http://java.local:8080/data.xml : null
network: Disconnect connection to http://java.local:8080/data.xml
network: Cache entry not found [url: http://java.local:8080/clear/META-INF/services/javax.xml.parsers.DocumentBuilderFactory, version: null]
network: Connecting http://java.local:8080/clear/META-INF/services/javax.xml.parsers.DocumentBuilderFactory with proxy=DIRECT


Похоже, что в первом случае не находится модуль javax.xml.parsers.DocumentBuilderFactory. Вопрос: почему? И как это исправить?
PM MAIL   Вверх
LSD
Дата 24.11.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Почитай JavaDoc по методу DocumentBuilderFactory.newInstance(), в частности:
Цитата

- Use the javax.xml.parsers.DocumentBuilderFactory system property.
- Use the properties file "lib/jaxp.properties" in the JRE directory. This configuration file is in standard java.util.Properties format and contains the fully qualified name of the implementation class with the key being the system property defined above. The jaxp.properties file is read only once by the JAXP implementation and it's values are then cached for future use. If the file does not exist when the first attempt is made to read from it, no further attempts are made to check for its existence. It is not possible to change the value of any property in jaxp.properties after it has been read for the first time.
- Use the Services API (as detailed in the JAR specification), if available, to determine the classname. The Services API will look for a classname in the file META-INF/services/javax.xml.parsers.DocumentBuilderFactory in jars available to the runtime.
- Platform default DocumentBuilderFactory instance.

и проверь все указанные источники.

P.S. Возможно тебе поможет опция запуска Djaxp.debug=1.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Real McCoy
Дата 24.11.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: нет
Всего: 2



LSD,
Спасибо за реакцию на мою проблему!

А не могли бы разъяснить неопытному... Я тут самостоятельно добрался до процитированного Вами куска, но это мне мало что дало: 
- пытался получить javax.xml.parsers.DocumentBuilderFactory, но получил java.security.AccessControlException: access denied (java.util.PropertyPermission javax.xml.parsers.DocumentBuilderFactory read);
- в jre\lib\ у меня нет файла jaxp.properties, равно как и в остальных местах jdk;

По поводу Platform default DocumentBuilderFactory instance - ведь, по идее, мой код и так должен его использовать. Разве нет? Ведь парсится же у меня xml, когда апплет грузится с локального сервера.

И ещё:

Цитата(LSD @  24.11.2007,  18:10 Найти цитируемый пост)
P.S. Возможно тебе поможет опция запуска Djaxp.debug=1.

Эту опцию можно применить при запуске апплета с удалённого сервера?

Спасибо!
PM MAIL   Вверх
Real McCoy
Дата 24.11.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: нет
Всего: 2



По поводу Djaxp.debug=1 понял: запустил с ним апплет локально и получил ответ на вопрос, какой у меня используется DocumentBuilderFactory
Код

JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
JAXP: found system property, value=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null


Почитал в спецификации JAR о Service provider'ах, увидел подобное в jre\lib\rt.jar. Сделал следующее:
- добавил в META-INF своего проекта каталог services, в него - файл javax.xml.parsers.DocumentBuilderFactory, состоящий из одной строки :
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

Всё заработало! Ошибка перестала возникать. smile

Буду весьма признателен, если скажете, правильно я сделал, или существует более прямой способ? И можно ли это добавление как-то автоматизировать (работаю в NetBeans 5.5.1)?
PM MAIL   Вверх
powerOn
Дата 25.11.2007, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



Цитата(Real McCoy @  24.11.2007,  20:58 Найти цитируемый пост)
Буду весьма признателен, если скажете, правильно я сделал, или существует более прямой способ? И можно ли это добавление как-то автоматизировать (работаю в NetBeans 5.5.1)? 

попробуй прямо в проекте делать добавление (т.е. создавай папку META-INF и т.д.)


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Real McCoy
Дата 25.11.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: нет
Всего: 2



powerOn, 
Спасибо, огромное!
Получилось в лучшем виде! smile
Делал именно так, как Вы подсказали (как это я сам не сообразил?): создал папку META-INF в корне проекта, в ней - паку services, в ней - файл с именем javax.xml.parsers.DocumentBuilderFactory и содержимым в виде одной строки com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl. При сборке получился именно такой JAR, как нужно.

Ещё раз спасибо! Увы, пока не могу Вам с LSD репутацию поднять smile
PM MAIL   Вверх
LSD
Дата 25.11.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Пожалуйста smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 25.11.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



Цитата(Real McCoy @  25.11.2007,  12:14 Найти цитируемый пост)
Увы, пока не могу Вам с LSD репутацию поднять

это дело поправимое. smile


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Real McCoy
Дата 24.12.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: нет
Всего: 2



Тема получила неожиданное продолжение. Функциональность той части апплета, где у меня парсится XML не изменилась: добавился абсолютно аналогичный существующему разбор ещё одной ветки.

Так вот, версия апплета, собранная на JDK1.6 работала нормально, а собранная на 1.5 выдавала почти такую же ошибку, как я описывал в начале ветки, только теперь для полного счастья не ватало другого парсера:

Код

network: Cache entry not found [url: http://xxxx.110mb.com/java5/META-INF/services/javax.xml.parsers.SAXParserFactory, version: null]
network: Connecting http://xxxx.110mb.com/java5/META-INF/services/javax.xml.parsers.SAXParserFactory with proxy=DIRECT
network: Cache entry not found [url: http://www.110mb.com/404.php, version: null]

Для лечения предпринял тот же шаг, что и описан выше: создал в папке META-INF\services файл с именем javax.xml.parsers.SAXParserFactory и содержимым в виде com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl.

Всё заработало нормально во всех версиях.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Апплеты | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.