[求助] @ConditionalOnClass @ConditionalOnBean 导致 starter 配置未生效

2022-07-22 18:12:11 +08:00
 cnit
@EnableConfigurationProperties(XXXXElasticSearchProperties.class)
@ConditionalOnProperty(value = "xxxxx.es.enabled", havingValue = "true")
@ConditionalOnClass(RestHighLevelClient.class)
@ConditionalOnBean(RestHighLevelClient.class)
public class LogAutoConfig {

    @Bean(name = "restHighLevelClient")
    public RestHighLevelClient restHighLevelClient() {
        // 拆分地址
        YidianElasticSearchProperties.Rest rest = yidianElasticSearchProperties.getRest();
        final boolean credentials =
            rest == null || StringUtils.isEmpty(rest.getPassword()) || StringUtils.isEmpty(rest.getUsername());
        // 权限验证
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        if (!credentials) {
            // 配置权限验证
            credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(rest.getUsername(), rest.getPassword()));
        }
        // 转换成 HttpHost 数组
        HttpHost[] httpHost =
            yidianElasticSearchProperties.getUris().stream().map(HttpHost::create).toArray(HttpHost[]::new);
        // 构建连接对象
        RestClientBuilder builder = RestClient.builder( httpHost);
        // 异步连接延时配置
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(yidianElasticSearchProperties.getConnectTimeout());
            requestConfigBuilder.setSocketTimeout(yidianElasticSearchProperties.getSocketTimeout());
            requestConfigBuilder
                .setConnectionRequestTimeout(yidianElasticSearchProperties.getConnectionRequestTimeout());
            return requestConfigBuilder;
        });
        // 异步连接数配置
        builder.setHttpClientConfigCallback( httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(yidianElasticSearchProperties.getMaxConnectNum());
            httpClientBuilder.setMaxConnPerRoute(yidianElasticSearchProperties.getMaxConnectPerRoute());
            if (credentials) {
                httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
            }
            return httpClientBuilder;
        });
        return new RestHighLevelClient(builder);
    }
}

这个配置在自定义的 starer 里面,启动时这个类有被扫描到但是不符合 math 所以没有被装配。

然后我手动复制一份这个类命名为 LogAutoConfig1,并删除了 @ConditionalOnClass @ConditionalOnBean 等一系列条件装配注解,神奇的是这个它居然报错 restHighLevelClient define in starter xxx path 说是在 starter 中 define 了,这就很奇怪了之前不是都没有装配,这下为什么会提示 define 了,于是我删除了 LogAutoConfig1 中的 restHighLevelClient 这部分代码,至此代码成功注册到 spring

这是为什么?

1259 次点击
所在节点    Java
6 条回复
wolfie
2022-07-22 18:27:43 +08:00
@ConditionalOnBean(RestHighLevelClient.class)
确定不是 OnMissing ?
cnit
2022-07-25 09:11:08 +08:00
@wolfie 就是 @ConditionalOnBean(RestHighLevelClient.class) 这块是离职的同事写的公用模块,其他项目里面都是好的
cnit
2022-07-25 09:21:51 +08:00
已解决 另外一个 starter 里面注册了 RestHighLevelClient ,引入另外一个 starter 就好了,从而解释了 @ConditionalOnBean(RestHighLevelClient.class) 但是这个注解从逻辑上来讲还是有些问题
wolfie
2022-07-25 09:29:34 +08:00
建议先看看 ConditionalOnBean 相关文档。
slomo
2022-07-26 17:58:28 +08:00
有了一个 RestHighLevelClient 再注册一个 RestHighLevelClient... 没搞这是什么逻辑
cnit
2022-07-27 14:44:04 +08:00
真的是坑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868069

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX