Spring 注释 @Entry.base 不支持 SpEL
SpEL not supported in Spring annotation @Entry.base
我使用 Spring Data LDAP 和 Spring Boot 为嵌入式 UnboundID 服务器提供开箱即用的支持。但是,当我使用 Spring Data LDAP 的 @Entry
注释时,我需要根据我使用的是嵌入式 UnboundID LDAP 服务器还是远程 Active 在注释中指定不同的 base
目录服务器。
我试图通过指定以下内容来使用 SpEL 和基于配置文件的属性来执行此操作:
@Entry(base = "${ldap.person.base}", ...)
然后我有一个 application.propreties
和 ldap.person.base=OU=AD Person Base
以及一个 application-embedded.properties
和 ldap.person.base=OU=Embedded Person Base
。
然而,@Entry
注释似乎不支持 SpEL 评估:
javax.naming.InvalidNameException: Invalid name: ${ldap.person.base}
Spring LDAP 中有一个 open issue 来添加对此的支持,但是在 Spring LDAP 支持它之前,是否有任何解决方法或其他方法可以实现此目的?
我不确定我是否关注这里,但假设您在 Spring 引导中使用 LDAP 自动配置,设置 属性 spring.ldap.base
根据您使用的配置文件选择一个或另一个(OU=AD Person Base
或 OU=Embedded Person Base
)?
EmbeddedLdapAutoConfiguration
和 LdapAutoConfiguration
都使用 LdapProperties
对象在 bean 创建期间在 LdapContextSource
上设置各种属性,包括它的 base
。据我所知,如果设置了 LdapContextSource.base
,则不必为代码库中的每个 @Entry
定义它。
如果您没有使用自动配置,并且我的假设是正确的,您应该仍然能够创建自己的 LdapContextSource
bean 并将其 base
设置为基于 Spring 属性.
的期望值
原来我首先需要一个不同的 base
的原因是因为 Spring 没有在 ContextSource
上设置 base
。
当您让 Spring 引导自动配置嵌入式 LDAP 服务器时,它会在 EmbeddedLdapAutoConfiguration
:
中创建一个 ContextSource
@Bean
@DependsOn("directoryServer")
@ConditionalOnMissingBean
public ContextSource ldapContextSource() {
LdapContextSource source = new LdapContextSource();
if (hasCredentials(this.embeddedProperties.getCredential())) {
source.setUserDn(this.embeddedProperties.getCredential().getUsername());
source.setPassword(this.embeddedProperties.getCredential().getPassword());
}
source.setUrls(this.properties.determineUrls(this.environment));
return source;
}
如您所见,它没有调用 source.setBase()
。所以为了解决这个问题,我添加了一个带有 @Profile("embedded")
的配置文件并手动创建了一个 ContextSource
我自己设置了 base
(我省略了凭证部分因为我不使用凭证嵌入式服务器):
@Configuration
@Profile("embedded")
@EnableConfigurationProperties({ LdapProperties.class })
public class EmbeddedLdapConfig {
private final Environment environment;
private final LdapProperties properties;
public EmbeddedLdapConfig(final Environment environment, final LdapProperties properties) {
this.environment = environment;
this.properties = properties;
}
@Bean
@DependsOn("directoryServer")
public ContextSource ldapContextSource() {
final LdapContextSource source = new LdapContextSource();
source.setUrls(this.properties.determineUrls(this.environment));
source.setBase(this.properties.getBase());
return source;
}
}
现在,我可以将 @Entry
中 base
属性的值保留为相同的 Active Directory 服务器和嵌入式 UnboundID 服务器,它可以正常工作。
我使用 Spring Data LDAP 和 Spring Boot 为嵌入式 UnboundID 服务器提供开箱即用的支持。但是,当我使用 Spring Data LDAP 的 @Entry
注释时,我需要根据我使用的是嵌入式 UnboundID LDAP 服务器还是远程 Active 在注释中指定不同的 base
目录服务器。
我试图通过指定以下内容来使用 SpEL 和基于配置文件的属性来执行此操作:
@Entry(base = "${ldap.person.base}", ...)
然后我有一个 application.propreties
和 ldap.person.base=OU=AD Person Base
以及一个 application-embedded.properties
和 ldap.person.base=OU=Embedded Person Base
。
然而,@Entry
注释似乎不支持 SpEL 评估:
javax.naming.InvalidNameException: Invalid name: ${ldap.person.base}
Spring LDAP 中有一个 open issue 来添加对此的支持,但是在 Spring LDAP 支持它之前,是否有任何解决方法或其他方法可以实现此目的?
我不确定我是否关注这里,但假设您在 Spring 引导中使用 LDAP 自动配置,设置 属性 spring.ldap.base
根据您使用的配置文件选择一个或另一个(OU=AD Person Base
或 OU=Embedded Person Base
)?
EmbeddedLdapAutoConfiguration
和 LdapAutoConfiguration
都使用 LdapProperties
对象在 bean 创建期间在 LdapContextSource
上设置各种属性,包括它的 base
。据我所知,如果设置了 LdapContextSource.base
,则不必为代码库中的每个 @Entry
定义它。
如果您没有使用自动配置,并且我的假设是正确的,您应该仍然能够创建自己的 LdapContextSource
bean 并将其 base
设置为基于 Spring 属性.
原来我首先需要一个不同的 base
的原因是因为 Spring 没有在 ContextSource
上设置 base
。
当您让 Spring 引导自动配置嵌入式 LDAP 服务器时,它会在 EmbeddedLdapAutoConfiguration
:
ContextSource
@Bean
@DependsOn("directoryServer")
@ConditionalOnMissingBean
public ContextSource ldapContextSource() {
LdapContextSource source = new LdapContextSource();
if (hasCredentials(this.embeddedProperties.getCredential())) {
source.setUserDn(this.embeddedProperties.getCredential().getUsername());
source.setPassword(this.embeddedProperties.getCredential().getPassword());
}
source.setUrls(this.properties.determineUrls(this.environment));
return source;
}
如您所见,它没有调用 source.setBase()
。所以为了解决这个问题,我添加了一个带有 @Profile("embedded")
的配置文件并手动创建了一个 ContextSource
我自己设置了 base
(我省略了凭证部分因为我不使用凭证嵌入式服务器):
@Configuration
@Profile("embedded")
@EnableConfigurationProperties({ LdapProperties.class })
public class EmbeddedLdapConfig {
private final Environment environment;
private final LdapProperties properties;
public EmbeddedLdapConfig(final Environment environment, final LdapProperties properties) {
this.environment = environment;
this.properties = properties;
}
@Bean
@DependsOn("directoryServer")
public ContextSource ldapContextSource() {
final LdapContextSource source = new LdapContextSource();
source.setUrls(this.properties.determineUrls(this.environment));
source.setBase(this.properties.getBase());
return source;
}
}
现在,我可以将 @Entry
中 base
属性的值保留为相同的 Active Directory 服务器和嵌入式 UnboundID 服务器,它可以正常工作。