You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新依赖后Spring Boot无法找到StateTraversalService Bean问题

Spring Boot项目双问题排查与解决

问题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.

排查与解决

  1. 组件扫描范围未覆盖
    测试应用的@SpringBootApplication默认仅扫描自身包及其子包,不会扫描外部库的io.github.jspinak.brobot.testingAUTs包。

    • 解决:在测试应用主类添加@ComponentScan(basePackages = {"brobot.elasticsearch.tests", "io.github.jspinak.brobot.testingAUTs"}),或直接指定类:@ComponentScan(basePackageClasses = StateTraversalService.class)
  2. 依赖库打包配置问题
    库中使用了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'),确保测试应用能获取类元数据。
  3. 依赖版本冲突
    检查测试应用的Spring Boot版本是否与库的3.1.0一致,隐性版本差异会导致Bean加载失败。

    • 解决:测试应用使用io.spring.dependency-management插件,统一依赖版本,避免冲突。

问题2:Elasticsearch HTTPS连接报错(明文流量进入HTTPS通道)

错误日志

received plaintext http traffic on an https channel, closing connection.

排查与解决

  1. 未配置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));
      
  2. 容器端口映射错误
    确认容器HTTPS端口(默认9200)是否正确映射到本地9200,避免将HTTP端口映射到本地9200。

    • 解决:检查docker-compose.yml,确保端口映射为9200:9200,且Elasticsearch配置xpack.security.http.ssl.enabled: true。
  3. 客户端与Elasticsearch版本不兼容
    客户端版本co.elastic.clients:elasticsearch-java:8.3.3需与Elasticsearch容器版本一致,否则会出现协议适配问题。

    • 解决:将客户端版本调整为与容器完全一致的版本。

额外建议

  • 优先解决Bean缺失问题,确保Spring上下文正常加载后再调试Elasticsearch连接。
  • 执行./gradlew clean build --refresh-dependencies清理Gradle缓存,避免旧依赖残留。

内容的提问来源于stack exchange,提问作者Joshua Spinak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:44:52