更新依赖后Spring Boot无法找到StateTraversalService Bean问题
问题1:StateTraversalService Bean无法找到
错误日志
Parameter 0 of constructor in brobot.elasticsearch.tests.TestElasticsearch required a bean of type 'io.github.jspinak.brobot.testingAUTs.StateTraversalService' that could not be found.
排查与解决
组件扫描范围未覆盖
测试应用的@SpringBootApplication默认仅扫描自身包及其子包,不会扫描外部库的io.github.jspinak.brobot.testingAUTs包。- 解决:在测试应用主类添加
@ComponentScan(basePackages = {"brobot.elasticsearch.tests", "io.github.jspinak.brobot.testingAUTs"}),或直接指定类:@ComponentScan(basePackageClasses = StateTraversalService.class)
- 解决:在测试应用主类添加
依赖库打包配置问题
库中使用了org.springframework.boot插件,会将其打包为可执行Jar,导致测试应用无法读取到Spring自动配置元数据。- 解决:移除库
build.gradle中的org.springframework.boot插件,保留io.spring.dependency-management管理依赖;同时将implementation改为api(如api 'org.springframework.boot:spring-boot-starter-data-elasticsearch'),确保测试应用能获取类元数据。
- 解决:移除库
依赖版本冲突
检查测试应用的Spring Boot版本是否与库的3.1.0一致,隐性版本差异会导致Bean加载失败。- 解决:测试应用使用
io.spring.dependency-management插件,统一依赖版本,避免冲突。
- 解决:测试应用使用
问题2:Elasticsearch HTTPS连接报错(明文流量进入HTTPS通道)
错误日志
received plaintext http traffic on an https channel, closing connection.
排查与解决
未配置SSL认证上下文
Elasticsearch 8.x默认强制HTTPS并需要证书验证,仅指定https协议但未配置SSL会导致请求降级为明文。- 解决:获取容器生成的
http_ca.crt证书,配置RestClient的SSL上下文:Path caCertPath = Paths.get("config/certs/http_ca.crt"); // 替换为实际证书路径 CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); Certificate trustedCa; try (InputStream is = Files.newInputStream(caCertPath)) { trustedCa = certFactory.generateCertificate(is); } KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); trustStore.setCertificateEntry("ca", trustedCa); SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial(trustStore, null).build(); RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "https")) .setHttpClientConfigCallback(clientBuilder -> clientBuilder.setSSLContext(sslContext));
- 解决:获取容器生成的
容器端口映射错误
确认容器HTTPS端口(默认9200)是否正确映射到本地9200,避免将HTTP端口映射到本地9200。- 解决:检查
docker-compose.yml,确保端口映射为9200:9200,且Elasticsearch配置xpack.security.http.ssl.enabled: true。
- 解决:检查
客户端与Elasticsearch版本不兼容
客户端版本co.elastic.clients:elasticsearch-java:8.3.3需与Elasticsearch容器版本一致,否则会出现协议适配问题。- 解决:将客户端版本调整为与容器完全一致的版本。
额外建议
- 优先解决Bean缺失问题,确保Spring上下文正常加载后再调试Elasticsearch连接。
- 执行
./gradlew clean build --refresh-dependencies清理Gradle缓存,避免旧依赖残留。
内容的提问来源于stack exchange,提问作者Joshua Spinak

