Spring Bean根据条件创建一个接口

时间:2020-06-16 07:26:27

标签: java spring conditional-statements

我的目标是要有两个bean实现,这些实现取决于属性或类路径中类的存在。我尝试的是ConditionalOnPropery,请参见下文,但没有用。

我有一个类似的界面

public interface ApplicationConfigurator {

    void configure(WicketApplication wicketApplication);

}

和两个实现类

@Component
@ConditionalOnProperty(
        value = "environment",
        havingValue = "client",
        matchIfMissing = false
)
public class OfflineApplicationConfigurator implements ApplicationConfigurator {

    @Override
    public void configure(WicketApplication wicketApplication) {

    }
}

@Component
    @ConditionalOnProperty(
            value = "environment",
            havingValue = "server",
            matchIfMissing = false
    )
public class OnlineApplicationConfigurator implements ApplicationConfigurator {

    @Autowired
    private LsgConfiguration configuration;

    @Override
    public void configure(WicketApplication wicketApplication) {
        try {
            Class.forName("org.apache.catalina.core.StandardServer");
            configuration.setHttpSchema(new TomcatConnectors().getHttpConnector().getScheme());
        } catch (ClassNotFoundException | ApplicationConfigurationException exception) {
            configuration.setHttpSchema("http");
        }
    }
}

我的配置基于xml,看起来像:

<bean id="onlineApplicationConfigurator" class="com.kion.lsg.service.core.web.config.OnlineApplicationConfigurator"/>
<bean id="offlineApplicationConfigurator" class="com.kion.lsg.service.core.web.config.OfflineApplicationConfigurator"/>

现在我收到错误消息:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [....service.core.web.config.ApplicationConfigurator] is defined: expected single matching bean but found 2: onlineApplicationConfigurator,offlineApplicationConfigurator

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

您是否在application.yml中指定条件变量'environment'?由于这两个都是组件,因此应自动扫描,而无需在XML文件中声明。您可以启用调试模式以查看条件评估报告,这将提供更多的见解。

相关问题