当前位置: 首页 > 知识库问答 >
问题:

为Spring启动配置第二个独立的 Ldap 模板

商焕
2023-03-14

我需要在现有的html" target="_blank">代码库中添加第二个LdapTemplate。LDAP目录完全不同,不共享任何内容。

其他人似乎也有类似的需求:https://github.com/spring-projects/spring-ldap/issues/409.我用Spring LDAP Repository找到了多个LDAP存储库,并添加了第二组LDAP配置条目作为< code>spring.ldap2.和这个附加的配置类:

@Configuration
public class LdapConfig {
    @Autowired
    private Environment environment;

    @Bean(name = "ldapProperties2")
    @ConfigurationProperties(prefix = "spring.ldap2")
    public LdapProperties ldapProperties() {
        return new LdapProperties();
    }

    @Bean(name = "contextSource2")
    public LdapContextSource contextSourceTarget(@Qualifier("ldapProperties2") LdapProperties ldapProperties) {
        LdapContextSource source = new LdapContextSource();
        source.setUserDn(ldapProperties.getUsername());
        source.setPassword(ldapProperties.getPassword());
        source.setBase(ldapProperties.getBase());
        source.setUrls(ldapProperties.determineUrls(this.environment));
        source.setBaseEnvironmentProperties(
                Collections.<String, Object>unmodifiableMap(ldapProperties.getBaseEnvironment()));
        return source;
    }

    @Bean(name = "ldapTemplate2")
    public LdapTemplate ldapTemplate(@Qualifier("contextSource2") LdapContextSource contextSource) {
        return new LdapTemplate(contextSource);
    }
}

启动投诉:

Parameter 0 of constructor in org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration required a single bean, but 2 were found:
    - ldapProperties2: defined by method 'ldapProperties' in class path resource [my/company/foo/LdapConfig.class]
    - spring.ldap-org.springframework.boot.autoconfigure.ldap.LdapProperties: defined in null

我试图添加@Primary但这也可以添加到我的类中,并且所有现有代码都已使用“旧”主模板。不幸的是,没有@Second

编辑

我做了更多尝试:

@Autowired
@Qualifier("ldapTemplate1")
LdapTemplate ad;

@Autowired
@Qualifier("ldapTemplate2")
LdapTemplate gd;

第一颗豆:

@Bean(name="ldapTemplate1")
public LdapTemplate ldapTemplate(@Qualifier("contextSource1") LdapContextSource contextSource) {
    return new LdapTemplate(contextSource);
}

第二颗豆子:

@Bean(name = "ldapTemplate2")
    public LdapTemplate ldapTemplate(@Qualifier("contextSource2") LdapContextSource contextSource) {
        return new LdapTemplate(contextSource);
    }

然后,Spring Boot抱怨道:

Field ad in com.example... required a bean of type 'org.springframework.ldap.core.LdapTemplate' that could not be found.
    - Bean method 'ldapTemplate' in 'LdapDataAutoConfiguration' not loaded because @ConditionalOnMissingBean (types: org.springframework.ldap.core.LdapOperations; SearchStrategy: all) found beans of type 'org.springframework.ldap.core.LdapOperations' ldapTemplate2
    - User-defined bean method 'ldapTemplate' in 'LdapConfiguration2'

即使我将其中的两个重命名为LdapTemplateSpring Boot也无法自动连线。

如何自动配置两个独立的 Ldap 模板?我使用的是Spring靴 2.0.5

共有1个答案

越伟泽
2023-03-14

这是我在 Tomcat 8.5 上部署的具有Spring 4 和Spring LDAP 的应用程序中使用的方法。

beans.xml

<beans:bean id="contextSource-one"
    class="org.springframework.ldap.pool2.factory.PooledContextSource">
    <beans:constructor-arg>
        <beans:bean class="org.springframework.ldap.pool2.factory.PoolConfig"
        p:testOnBorrow="true" p:minEvictableIdleTimeMillis="300000" p:maxWaitMillis="5000" />
    </beans:constructor-arg>
    <beans:property name="contextSource">
        <beans:bean
            class="...ContextSource"...>
        </beans:bean>
    </beans:property>
    <beans:property name="dirContextValidator">
        <beans:bean
            class="org.springframework.ldap.pool2.validation.DefaultDirContextValidator" />
    </beans:property>
</beans:bean>

<beans:bean id="contextSource-two"
    class="org.springframework.ldap.pool2.factory.PooledContextSource">
    <beans:constructor-arg>
        <beans:bean class="org.springframework.ldap.pool2.factory.PoolConfig"
        p:testOnBorrow="true" p:minEvictableIdleTimeMillis="300000" p:maxWaitMillis="5000" />
    </beans:constructor-arg>
    <beans:property name="contextSource">
        <beans:bean
            class="...ContextSource"...>
        </beans:bean>
    </beans:property>
    <beans:property name="dirContextValidator">
        <beans:bean
            class="org.springframework.ldap.pool2.validation.DefaultDirContextValidator" />
    </beans:property>
</beans:bean>

适应您的需求和/或转换为Java配置。

这是依赖类,几乎像你的:

public class MyClass {
    private List<LdapTemplate> ldapTemplates;

    @Autowired
    public MyClass(List<ContextSource> contextSources) {
        this.ldapTemplates = new LinkedList<>();
        for (ContextSource cs : contextSources)
            this.ldapTemplates.add(new LdapTemplate(cs));
    }
}
 类似资料:
  • 我正在使用Spring Boot创建一个独立的jar,使用Export命令和Runnable jar,并试图在命令提示符下运行jar,但它会抛出以下错误,同一个应用程序正在Eclipse中运行。我不能使用maven,我也没有在我的应用程序中使用spring-boot-thymeleaf。即使在添加了spring-boot-autoconfigurator-thymeleaf jar之后,我也会得到

  • 我有一个需要执行LDAP查询的Spring启动应用程序。我正在尝试从Spring启动文档中获取以下建议: Internet上已经发布了许多使用XML配置的Spring配置示例。如果可能,请始终尝试使用等效的基于Java的配置。 在Spring XML配置文件中,我会使用: 我如何使用基于Java的配置来配置它?我需要能够更改ldap的URL、base、用户名和密码属性:上下文源,而无需代码重建。

  • 我正在尝试使用spring数据构建一个LdapTemplate对象。 我想知道的是实例化ldap模板对象的正确方法。因为当我执行查找时,它会抛出NPE。 我试图在CDI上下文中使用LDAP Spring而根本不使用Spring。如果您有指针,那就太好了。Spring LDAP是否依赖于Spring?

  • 我正在使用Intellij IDEA 14.1,并试图调试最基本的独立Spring Boot 1.2.5应用程序。有人能告诉我怎么做吗? 我读过http://docs.spring.io/autorepo/docs/spring-boot/1.2.5.RELEASE/maven-plugin/usage.html但并没有成功地使其发挥作用。最简单的方法是禁用Spring Boot在调试时使用的分叉

  • 我第一次使用Spring Cloud Config Server,并有一个基本的查询。 SpringConfigServer将配置外部化到一个单独的git存储库中。 为什么我要为配置创建一个单独的存储库? 在一个repo中使用包含所有应用程序代码和配置的mono存储库,不比只为配置创建一个单独的存储库更可取吗。 我们在同一个存储库中有多个微服务。配置服务器不应该是存在于其他应用程序代码所在的同一存

  • 我刚开始使用Xamarin和VisualStudio2017在C#中为Android开发。与Windows生态系统完全不同的范例…Target是一个商业应用程序,将有特定的受众,但在我深入了解之前,我只是试图学习绳子,理解概念和程序… 因此,我从最简单的app开始,使用空白模板。这将创建一个项目,其中包含一个活动(mainactivity.cs)、两个资源(resources\layout\mai