У меня очень странная проблема с WebLogic 12.1.3.0.0. У меня есть приложение, которое вызывает NullPointerException
внутри AdminServer
во время развертывания, но приложение работает нормально после ошибки.
NullPointerException
во время развертывания происходит потому, что процесс развертывания не учитывает следующие параметры в моих дескрипторах развертывания:
AppName.war/WEB-INF/weblogic.xml
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app>
<context-root>AppName</context-root>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
И AppName.ear/META-INF/weblogic-application.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application>
<prefer-application-packages>
<package-name>javax.faces.*</package-name>
</prefer-application-packages>
</weblogic-application>
Так как эти настройки игнорируются, класс javax.faces.webapp.FacesServlet
загружается загрузчиком системных классов (sun.misc.Launcher$AppClassLoader
) из $WL_HOME/wlserver/modules/glassfish.jsf_2.0.0.0_2-1-20.jar
, а не из загрузчика классов WAR. Это в конечном итоге приводит к NPE
из-за некоторого плохо написанного кода в weblogic.servlet.internal.WebAnnotationProcessor
, который предполагает, что javax.faces.webapp.FacesServlet
будет аннотирован @MultipartConfig
, чего нет в glassfish.jsf_2.0.0.0_2-1-20.jar
. Правильная версия этого класса находится в AppName.ear/AppName.war/WEB-INF/lib/jsf-api-2.2.16.jar
.
Я проверил все это удаленной отладкой AdminServer и включив ведение журнала Classloader, которое показывает это:
GCL[61ba0535][AppName.ear@AppName.war] GCL.loadClass(javax.faces.webapp.FacesServlet)>
FCL[10d372cb][] FCL.loadClass(javax.faces.webapp.FacesServlet)>
FCL[10d372cb][] FCL.findClass(javax.faces.webapp.FacesServlet)>
GCL[75bc8d74][DomainLib] GCL.loadClass(javax.faces.webapp.FacesServlet)>
Эта проблема делает невозможным открытие AppName
Развертывания в консоли администратора, т.к. он всегда выдает ошибку (с вышеупомянутым NPE в журналах):
The configuration for AppName is still being loaded from your last request, please wait a moment and retry.
В отличие от этого, когда я запускаю EAR на сервере, где он был развернут, точно такой же EAR работает просто отлично. Чтобы доказать, что загрузка классов работает правильно, вот журнал:
CACL[6eb4b4ad][AppName@AppName] CACL.loadClass(javax.faces.webapp.FacesServlet)>
CACL[6eb4b4ad][AppName@AppName] GCL.loadClass(javax.faces.webapp.FacesServlet)>
FCL[37ee3b94][AppName@AppName] FCL.loadClass(javax.faces.webapp.FacesServlet)>
FCL[37ee3b94][AppName@AppName] FCL.findClass(javax.faces.webapp.FacesServlet)>
GCL[3cc63f62][AppName@] GCL.loadClass(javax.faces.webapp.FacesServlet)>
FCL[770e8d03][] FCL.loadClass(javax.faces.webapp.FacesServlet)>
FCL[770e8d03][] FCL.findClass(javax.faces.webapp.FacesServlet)>
FCL[770e8d03][] FCL.matchesClassFilterList(javax.faces.webapp.FacesServlet): javax.faces. index : 0 end : 12>
FCL[770e8d03][] FCL.findClass(javax.faces.webapp.FacesServlet): Found match>
GCL[3cc63f62][AppName@] GCL.findClass(javax.faces.webapp.FacesServlet)>
GCL[3cc63f62][AppName@] GCL.findLocalClass(javax.faces.webapp.FacesServlet): Classpath in use: <LIST OF ALL JARS IN MY EAR>
GCL[3cc63f62][AppName@] GCL.findLocalClass(javax.faces.webapp.FacesServlet): not found>
CACL[6eb4b4ad][AppName@AppName] CACL.findClass(javax.faces.webapp.FacesServlet)>
CACL[6eb4b4ad][AppName@AppName] CACL.findClass(javax.faces.webapp.FacesServlet): About to loadClass>
CACL[6eb4b4ad][AppName@AppName] GCL.findClass(javax.faces.webapp.FacesServlet)>
CACL[6eb4b4ad][AppName@AppName] GCL.findLocalClass(javax.faces.webapp.FacesServlet): Classpath in use: <LIST OF ALL JARS IN MY WAR>
CACL[6eb4b4ad][AppName@AppName] GCL.findLocalClass(javax.faces.webapp.FacesServlet): Found class>
CACL[6eb4b4ad][AppName@AppName] GCL.defineClass(javax.faces.webapp.FacesServlet)>
Я не знаю, как это исправить ... Почему AdminServer полностью игнорирует дескрипторы развертывания в моем EAR, в то время как сервер, который запускает EAR, все настраивает правильно?
Любые идеи приветствуются.