背景
同样因为之前老项目使用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上的差异,导致编译时期报错