高版本SpringBoot兼容低版本ElasticSearch解决方案

1,135 阅读1分钟

背景

同样因为之前老项目使用sprignboot 2.2.13.RELEASE,后面由于公司安全监测,需要对一些组件进行版本升级,包括mybatis和es和logback-classic等版本都需要升级。最终决定将springboot升级到2.6.15版本,升级之后由于依赖的spring-data-elasticsearch也相应升级(从3.2.12.RELEASE->4..),后者使用es7的客户端api,而目前的服务器安装的还是es6,暂不方便升级到es7。于是尝试在使用spring2.6的同时还使用spring-data-elasticsearch:3.2.12.RELEASE,以支持es6的使用。

解决方法

第一步

启动类上增加注解:此注解取消spring-boot-autoconfigure关于spring-data-elasticsearch的自动装配

@SpringBootApplication(exclude = {ElasticsearchDataAutoConfiguration.class, ElasticsearchRepositoriesAutoConfiguration.class})

第二步

手动完成第一步取消的关于spring-data-elasticsearch相关组件的注册

@EnableConfigurationProperties({ElasticsearchProperties.class})
@Configuration
public class ElasticSearchConfig  {

    @Bean
    public ElasticsearchRestTemplate elasticsearchTemplate(RestHighLevelClient client) {
        return new ElasticsearchRestTemplate(client);
    }
    

    /**
     * 为了在springboot2.6下使用spring-data-elasticsearch 3.2.12.RELEASE ,禁用通过注解的形式自动扫描,改用手动方式创建对应实例
     * @param operations
     * @return
     */
    @Bean
    public ElasticsearchRepositoryFactory elasticsearchRepositoryFactory(ElasticsearchRestTemplate operations){
        return new ElasticsearchRepositoryFactory(operations);
    }

    @Bean
    public BlockHeadRepository blockHeadRepository(ElasticsearchRepositoryFactory factory){
        return factory.getRepository(BlockHeadRepository.class);
    }
    @Bean
    public BlockIndexRepository blockIndexRepository(ElasticsearchRepositoryFactory factory){
        return factory.getRepository(BlockIndexRepository.class);
    }
    @Bean
    public ServerLogRepository serverLogRepository(ElasticsearchRepositoryFactory factory){
        return factory.getRepository(ServerLogRepository.class);
    }

}

其中BlockHeadRepository、BlockIndexRepository、ServerLogRepository都是之前通过@Repository注解的ElasticsearchRepository实现 例如:

//@Repository
public interface BlockHeadRepository extends ElasticsearchRepository<BlockHead, Integer> {

    int countByHeight(Integer height);

    void deleteByTimestampLessThanEqual(long time);
}

第三步 如果之前有使用ElasticsearchTemplate替换成ElasticsearchRestTemplate,其他repository正常像之前一样使用即可

@Autowired
private ElasticsearchRestTemplate elasticsearchTemplate;
@Autowired
private ServerLogRepository serverLogRepository;

结论

上述操作实现原理就是将原本spring-boot-autoconfigure中关于高版本spring-data-elasticsearch中的自动注册取消,改动手动注册的低版本spring-data-elasticsearch。而为什么不直接按高版本spring-boot-autoconfigure自动注册低版本的spring-data-elasticsearch就是因为api上的差异,导致编译时期报错

参考

www.yii666.com/blog/467232…