J'ai une simple application Spring MVC qui recherche des détails d'utilisateur à partir d'un serveur LDAP et imprime une simple page HTML en utilisant une JSP. L'application fonctionne correctement sur Tomcat 6. Elle utilise Spring LDAP 1.3.1 et LDAPTemplate pour effectuer les recherches LDAP.NoClassDefFoundError dans Websphere - Les fichiers JAR sont présents
Cependant, lorsque je déploie cette application WAR sur Websphere 7, l'application ne s'exécute pas - Websphere renvoie une erreur 500 Internal Server. En regardant le fichier journal de Websphere, je vois
[14/12/10 14:50:09:169 GMT] 00000022 DispatcherSer E org.springframework.web.servlet.FrameworkServlet initServletBean Context initialization failed
org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.springframework.ldap.core.support.LdapContextSource] for bean with name 'contextSource' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: org.springframework.beans.factory.InitializingBean
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1253)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:576)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1319)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:885)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:562)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
Ma web-inf \ lib a tous les fichiers JAR, y compris org.springframework.beans-3.0.5.RELEASE.jar
, qui contient InitializingBean
. Je ne suis donc pas sûr de savoir pourquoi Websphere signale que la classe est manquante.
Contenu de mon web-inf \ lib:
aopalliance.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
commons-pool-1.5.4.jar
jstl-api-1.2.jar
jstl-impl-1.2.jar
ldapbp-1.0.jar
org.springframework.aop-3.0.5.RELEASE.jar
org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
org.springframework.jdbc-3.0.5.RELEASE.jar
org.springframework.oxm-3.0.5.RELEASE.jar
org.springframework.transaction-3.0.5.RELEASE.jar
org.springframework.web-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar
spring-ldap-1.3.1.RELEASE-all.jar
Et voici la définition du contextSource
haricot qui Websphere est d'avoir des difficultés à charger (le nom d'utilisateur/mot de passe est valide et fonctionne avec Tomcat):
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="ldaps://moo.example.com:1300/" />
<property name="userDn" value="CN=foo,OU=baz,DC=bar,DC=blat,DC=org" />
<property name="password" value="*******" />
</bean>
Je serais très heureux si quelqu'un pouvait expliquer pourquoi cela ne fonctionne pas sur Websphere. Je ne suis pas très sûr des règles de chargement de classes dans Websphere et j'apprécierais tout conseil à ce sujet.
Merci Manglu. En parcourant le journal avec le chargement des classes activé, j'ai découvert qu'une version différente du fichier Spring LDAP jar était en cours de chargement à partir d'un autre emplacement car l'administrateur avait stocké une source de contexte Spring LDAP dans JNDI. Définir le classloader pour mon application pour utiliser "parent last" a résolu le problème. – sigint