J'utilise la classe Spring LdapTemplate pour accéder à ldap. J'utilise un pool de connexions ldap (classe PoolingContextSource) pour éviter de créer des connexions tout le temps à l'exécution. Cependant, j'obtiens parfois cette exception dans mon application :
javax.servlet.ServletException: org.springframework.ldap.CommunicationException: Connection reset;
nested exception is javax.naming.CommunicationException: Connection reset [Root exception is java.net.SocketException: Connection reset];
Remaining name: 'ou=memberlist,ou=mygroups,o=mycompany.com'
(...)
Mes classes ldap sont définies dans le xml suivant
<bean id="contextSource" class="com.ibm.tp4.spring.ldap.CustomPoolingContextSource">
<property name="contextSource" ref="contextSourceTarget" />
<property name="testWhileIdle" value="true" />
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="timeBetweenEvictionRunsMillis" value="10000"/>
<property name="dirContextValidator">
<bean class="org.springframework.ldap.pool.validation.DefaultDirContextValidator" />
</property>
</bean>
<bean id="contextSourceTarget" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="${ldap.url}" />
<property name="pooled" value="false" />
<property name="anonymousReadOnly" value="true" />
</bean>
<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
<constructor-arg ref="contextSource" />
</bean>
<bean id="myLdapResolver" class="com.ibm.tp4.model.service.user.MyLdapResolver">
<constructor-arg ref="ldapTemplate" />
<property name="ldapUserSearchBase" value="${ldap.user.search_base}" />
<property name="ldapUserEmailAddressField" value="${ldap.user.email_address}" />
<property name="ldapAttributes" value="${ldap.user.attributes}" />
</bean>
Quelqu'un a-t-il rencontré ce problème et peut-il suggérer une solution ?
J'ai pensé à utiliser le paramètre testOnReturn dans les propriétés du pool au lieu de l'évictor de connexion utilisé actuellement. Lorsque je le fais, j'obtiens l'avertissement suivant lorsque je lance mon application web dans le navigateur :
WARN [org.springframework.ldap.pool.validation.DefaultDirContextValidator] -
DirContext 'javax.naming.ldap.InitialLdapContext@d150d15' failed validation with an
exception.javax.naming.OperationNotSupportedException: [LDAP: error code 53 - Unwilling To Perform];
Remaining name: ''
et peu après, je reçois cette exception :
org.springframework.dao.DataAccessResourceFailureException: Failed to borrow DirContext from pool.; nested exception is java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed
org.springframework.ldap.pool.factory.PoolingContextSource.getContext(PoolingContextSource.java:425)
Merci d'avance.