如何配置Spring LDAP的DirContextValidator解决连接池对象验证失败问题
问题根因
启用testOnBorrow、testWhileIdle连接池校验开关后,必须配套为PooledContextSource显式配置DirContextValidator实现,否则连接池没有校验DirContext有效性的逻辑,会直接抛出对象验证失败的异常。
正确配置方案
你可以直接使用Spring LDAP自带的默认校验器DefaultDirContextValidator,修改后的代码如下:
open fun create(): LdapTemplate { // 初始化DirContext校验器 val dirContextValidator = DefaultDirContextValidator().apply { // 可选配置:校验时执行的搜索Base DN,默认是空字符串,可根据你的LDAP结构调整 base = "" // 可选配置:校验时执行的搜索过滤器,默认是"(objectClass=*)" filter = "(objectClass=*)" // 可选配置:搜索返回的结果条数阈值,默认是0,只要返回结果不为空就判定校验通过 searchResultLimit = 0 } return LdapTemplate(PooledContextSource( PoolConfig().apply { maxTotalPerKey = 10 isTestOnBorrow = true isTestWhileIdle = true minEvictableIdleTimeMillis = timeToMillis }) .apply { contextSource = ldapContextSourceFactory.create() // 绑定校验器到连接池 dirContextValidator = dirContextValidator // 可选配置:校验失败后是否丢弃该连接,默认是true,无需修改 isRemoveAbandonedOnBorrow = true }) .apply { setIgnorePartialResultException(true) afterPropertiesSet() } }
自定义校验规则(可选)
如果默认的搜索校验逻辑不符合你的业务需求,你可以自行实现DirContextValidator接口,重写validateDirContext(DirContext ctx)方法,自定义校验逻辑返回布尔值标识校验是否通过即可。
内容的提问来源于stack exchange,提问作者Venot
相关产品推荐
相关产品推荐

