Merge pull request #51441 from 2heunxun

Closes gh-51441

* pr/51441:
  Polish LdapHealthIndicator
  Fix LdapHealthIndicator reporting when LDAP version is unavailable
This commit is contained in:
Phillip Webb
2026-08-25 11:49:22 -07:00
2 changed files with 16 additions and 18 deletions
@@ -16,9 +16,6 @@
package org.springframework.boot.ldap.health;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.health.contributor.AbstractHealthIndicator;
@@ -37,7 +34,8 @@ import org.springframework.util.Assert;
*/
public class LdapHealthIndicator extends AbstractHealthIndicator {
private static final ContextExecutor<@Nullable String> versionContextExecutor = new VersionContextExecutor();
private static final ContextExecutor<@Nullable String> versionContextExecutor = (
dirContext) -> (String) dirContext.getEnvironment().get("java.naming.ldap.version");
private final LdapOperations ldapOperations;
@@ -49,23 +47,11 @@ public class LdapHealthIndicator extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
builder.up();
String version = this.ldapOperations.executeReadOnly(versionContextExecutor);
if (version != null) {
builder.up().withDetail("version", version);
builder.withDetail("version", version);
}
}
private static final class VersionContextExecutor implements ContextExecutor<@Nullable String> {
@Override
public @Nullable String executeWithContext(DirContext ctx) throws NamingException {
Object version = ctx.getEnvironment().get("java.naming.ldap.version");
if (version != null) {
return (String) version;
}
return null;
}
}
}
@@ -49,6 +49,18 @@ class LdapHealthIndicatorTests {
then(ldapTemplate).should().executeReadOnly((ContextExecutor<String>) any());
}
@Test
@SuppressWarnings("unchecked")
void ldapIsUpWhenVersionIsUnavailable() {
LdapTemplate ldapTemplate = mock(LdapTemplate.class);
given(ldapTemplate.executeReadOnly((ContextExecutor<String>) any())).willReturn(null);
LdapHealthIndicator healthIndicator = new LdapHealthIndicator(ldapTemplate);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.UP);
assertThat(health.getDetails()).doesNotContainKey("version");
then(ldapTemplate).should().executeReadOnly((ContextExecutor<String>) any());
}
@Test
@SuppressWarnings("unchecked")
void ldapIsDown() {