2016-12-13 3 views
0

У меня есть webapp, который сохраняет состояние на стороне клиента. Штат накапливается в Object []ClassNotFoundException при десериализации в Weblogic 12c

Object state[] = new Object[10]; 

state[0] = _parent_s_state_array 
state[1] = _some_int; 
state[2] = _some_POJO; 
.. 
.. 

то

  • сериализованная
  • кодировке Base64
  • включен как скрытый вход в ответ

В следующем запросе этого сериализованная состояния возвращается назад, и мы реверсируем шаги по восстановлению состояния на серверах. Эта стратегия отлично работает на несколько сотен страниц.

Но для определенной страницы с использованием определенного POJO с несколькими свойствами String, я получаю ClassNotFoundException при десериализации. Следует отметить, что объект того же класса был создан и сериализован несколько мгновений назад в одном сеансе JVM, поэтому мы можем исключить, что класс не присутствует в пути к классам.

Некоторые больше наблюдений

  • Эта ошибка возникает только в производственных и испытательных платформ, которая находится в Weblogic 12с и никогда не видел в развитии, где он работает в причалу 8 или 9. Поэтому я угадывание это как-то связано с загрузкой классов Weblogic.
  • Эта проблема последовательно реплицируется на этой конкретной странице.
  • Существуют и другие страницы, которые используют один и тот же класс защиты без каких-либо проблем на той же платформе.
  • веб-приложение развертывается из взорвавшегося каталога войны и класс в вопросе присутствует в WEB-INF/classes/com/xxx/yyy/

Может кто-то обеспечить некоторые указатели/стратегию по отношению к отладке этой проблемы.

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

Исключение

ERROR [[ACTIVE] ExecuteThread: '5' for queue: 'weblogic.kernel.Default (self-tuning)'] ClassNotFoundException occured restoring StateManager state from serialized form 
java.lang.ClassNotFoundException: com.xxx.yyy.TimeParameters 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366) ~[na:1.7.0_65] 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) ~[na:1.7.0_65] 
     at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_65] 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[na:1.7.0_65] 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425) ~[na:1.7.0_65] 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) ~[na:1.7.0_65] 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ~[na:1.7.0_65] 
     at java.lang.Class.forName0(Native Method) [na:1.7.0_65] 
     at java.lang.Class.forName(Class.java:270) [na:1.7.0_65] 
     at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:625) ~[na:1.7.0_65] 
     at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612) ~[na:1.7.0_65] 
     at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517) ~[na:1.7.0_65] 
     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) ~[na:1.7.0_65] 
     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) ~[na:1.7.0_65] 
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) ~[na:1.7.0_65] 
     at org.apache.commons.collections.map.AbstractHashedMap.doReadObject(AbstractHashedMap.java:1212) ~[weblogic.server.merged.jar:12.1.3.0.0] 
     at org.apache.commons.collections.map.CaseInsensitiveMap.readObject(CaseInsensitiveMap.java:149) ~[weblogic.server.merged.jar:12.1.3.0.0] 

Класс

package com.xxx.yyy; 
public class TimeParameters implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 5384703411813811209L; 
    private String yr; 
    private String qtr; 
    private String mth; 
    private String analysisType; 

// Getters and Setters 
... 
... 
} 

ответ

1

TLDR;

Класс из коллекций Apache Commons был задействован где-то во время сериализации. Поскольку сборка apache-commons была загружена из баннеров Weblogic, это вызвало поиск требуемого класса в Applicationloader приложения, где его не удалось найти.Fix было добавить org.apache.commons.collections.* к prefer-application-packages в weblogic.xml

Подробности

Я сделал сеанс удаленного отладчика проследить на вызов Class.forName0(String className, boolean, ClassLoader loader).

Найдено, что, когда требуется класс может быть загружен, загрузчик классов прошли имел более глубокую иерархию

this contains all classes in WEB-INF/classes --> [email protected] finder: [email protected]d01c0c annotation: [email protected] 
[email protected] finder: [email protected] annotation: 
[email protected] finder: [email protected] annotation: 
[email protected] 
Application classloader, contains classes from weblogic bundled jars --> [email protected] 
[email protected] 

И когда он бросил ClassNotFoundException его оборвалась - только две последние записи присутствовали

[email protected] <-- Hierarchy starts at Application classloader 
[email protected] 

Затем я заметил, что в стеке лежали эти строки, заканчивающиеся на ~[weblogic.server.merged.jar:12.1.3.0.0] (отредактированный вопрос, чтобы добавить больше stacktrace)

at org.apache.commons.collections.map.AbstractHashedMap.doReadObject(AbstractHashedMap.java:1212) ~[weblogic.server.merged.jar:12.1.3.0.0] 
    at org.apache.commons.collections.map.CaseInsensitiveMap.readObject(CaseInsensitiveMap.java:149) ~[weblogic.server.merged.jar:12.1.3.0.0] 

Так что Apache Commons коллекция была загружена из WebLogic в комплекте банки, т.е. [email protected], которые могли бы вызвали неправильно загрузчик классов, чтобы передать дальше вниз по линии. Так добавляют org.apache.commons.collections.* к prefer-application-packages в weblogic.xml

<prefer-application-packages> 
     ... 
     <package-name>org.apache.commons.collections.*</package-name> 
    </prefer-application-packages> 

Полезные ресурсы

+0

Это была бы моя другая идея. Я также запускал несколько раз в странных проблемах с загрузчиками классов weblogic. –

0

сериализация не лучший способ выполнить задание. Вам будет лучше сериализовать его (скажем) JSON, а затем сжать его, если хотите. Хорошим выбором будет Google GSON. Или XStream с драйвером JSON. Or Jackson ...

+0

К сожалению, я не могу изменить это сейчас. Кроме того, это работает на несколько сотен страниц. – mzzzzb