将组件从 Spring Boot 2.7.18 升级到 Spring Boot 3.2.2 时,我们看到所有 spring-kafka EmbeddedKafka 测试均失败,并出现以下 Spring 初始化错误:
java.lang.NoSuchFieldError: id
at kafka.server.Defaults$.<clinit>(KafkaConfig.scala:187) ~[kafka_2.13-3.6.1.jar:na]
at kafka.server.KafkaConfig$.<clinit>(KafkaConfig.scala:746) ~[kafka_2.13-3.6.1.jar:na]
at kafka.server.KafkaConfig.DeleteTopicEnableProp(KafkaConfig.scala) ~[kafka_2.13-3.6.1.jar:na]
at org.springframework.kafka.test.EmbeddedKafkaKraftBroker.addDefaultBrokerPropsIfAbsent(EmbeddedKafkaKraftBroker.java:256) ~[spring-kafka-test-3.1.1.jar:3.1.1]
at org.springframework.kafka.test.EmbeddedKafkaKraftBroker.afterPropertiesSet(EmbeddedKafkaKraftBroker.java:202) ~[spring-kafka-test-3.1.1.jar:3.1.1]
at org.springframework.kafka.test.context.EmbeddedKafkaContextCustomizer.customizeContext(EmbeddedKafkaContextCustomizer.java:130) ~[spring-kafka-test-3.1.1.jar:3.1.1]
at org.springframework.boot.test.context.SpringBootContextLoader$ContextCustomizerAdapter.initialize(SpringBootContextLoader.java:442) ~[spring-boot-test-3.2.2.jar:3.2.2]
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:627) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:400) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:333) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) ~[spring-boot-test-3.2.2.jar:3.2.2]
at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[spring-core-6.1.3.jar:6.1.3]
at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[spring-core-6.1.3.jar:6.1.3]
at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1454) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:552) ~[spring-boot-test-3.2.2.jar:3.2.2]
有人见过这个或对如何解决它有任何建议吗?
从堆栈跟踪中,我们看到它找不到“id”字段。
但不确定这个“id”是什么。
如何对调用 scala 代码的 spring-kafka 代码进行故障排除? Intellij 控制台中的行号似乎没有映射到实际的 scala 代码。
Spring Boot 2.7.18 使用的原始版本: spring-kafka 2.9.13,kafka-clients 3.2.3
Spring Boot 3.2.2使用的版本: spring-kafka 3.1.1,kafka-clients 3.6.1
这里是 Spring Boot 3.2.2 所使用的依赖项/版本的列表。
dependencies {
api platform (group: 'org.springframework.boot', name: 'spring-boot-dependencies', version: "3.2.2")
api (group: 'org.springframework.boot', name: 'spring-boot-configuration-processor')
api (group: 'org.springframework.boot', name: 'spring-boot-starter-actuator')
api (group: 'org.springframework.boot', name: 'spring-boot-starter-data-jdbc')
api (group: 'org.springframework.boot', name: 'spring-boot-starter-json')
api (group: 'org.springframework.boot', name: 'spring-boot-starter-web')
api (group: 'org.springframework.boot', name: 'spring-boot-starter-security')
api (group: 'org.springframework.kafka', name: 'spring-kafka')
api (group: 'com.google.guava', name: 'guava', version: '33.0.0-jre')
api (group: 'com.sapiens.bdms', name: 'bdms-java-exe-helper', version: '7.1')
api (group: 'jakarta.validation', name: 'jakarta.validation-api', version: '3.0.2')
api (group: 'org.ehcache', name: 'ehcache', version: '3.10.8')
api (group: 'org.apache.avro', name: 'avro', version: '1.11.3')
api (group: 'org.apache.httpcomponents.client5', name: 'httpclient5', version: '5.3')
api (group: 'org.hibernate.validator', name: 'hibernate-validator', version: '8.0.1.Final')
api (group: 'redis.clients', name: 'jedis', version: '5.1.0')
implementation (group: 'org.apache.tika', name: 'tika-core', version: '2.9.1')
// lombok
implementation (group: 'org.projectlombok', name: 'lombok', version: "1.18.30")
annotationProcessor (group: 'org.projectlombok', name: 'lombok', version: "1.18.30")
testImplementation (group: 'org.projectlombok', name: 'lombok', version: "1.18.30")
testAnnotationProcessor (group: 'org.projectlombok', name: 'lombok', version: "1.18.30")
testImplementation (group: 'com.h2database', name: 'h2')
testImplementation (group: 'org.wiremock', name: 'wiremock', version: '3.3.1'){
exclude group: 'org.slf4j', module: 'slf4j-api'
}
testImplementation (group: 'io.confluent', name: 'kafka-avro-serializer', version: '7.5.1')
testImplementation (group: 'io.micrometer', name: 'micrometer-registry-prometheus', version: '1.12.1')
testImplementation (group: 'it.ozimov', name: 'embedded-redis', version: '0.7.3'){
exclude group: 'org.slf4j', module: 'slf4j-simple'
}
testImplementation (group: 'org.awaitility', name: 'awaitility', version: '4.2.0')
testImplementation (group: 'jakarta.el', name: 'jakarta.el-api', version: '5.0.1')
testImplementation (group: 'org.springframework.boot', name: 'spring-boot-starter-test')
testImplementation (group: 'org.springframework.kafka', name: 'spring-kafka-test')
testImplementation (group: 'org.springframework.boot', name: 'spring-boot-starter-aop')
testImplementation (group: 'junit', name: 'junit', version: '4.13.2')
testImplementation('org.scala-lang:scala3-library_3:3.3.1')
}
我们在 Spring Boot 3.2.2 上还有其他组件成功运行了 EmbeddedKafka 测试。
我比较了依赖树,但尚未找到会导致 NoSuchFieldError 的差异。
这是由于依赖项配置错误造成的。换句话说,就
spring-kafka
而言,主要依赖项(例如 kafka-clients
)所依赖的任何内容都不匹配。
我在设置
embedded-kafka-schema-registry
依赖项时遇到了这个问题(并不完全是你一直在做的事情),但解释是一样的。
我该如何解释这个错误:
java.lang.NoSuchFieldError: id
,你猜?
查看堆栈跟踪显示了这种依赖项不匹配的副作用。
代码中的
kafka.server.Defaults$.<clinit>(KafkaConfig.scala:187) ~[kafka_2.13-3.6.1.jar:na]
行是这行:
val OffsetsTopicCompressionCodec: Int = OffsetConfig.DefaultOffsetsTopicCompressionType.id
你能看到这个吗
id
?这就是 OffsetConfig.DefaultOffsetsTopicCompressionType
所指向的内容(来自不匹配的版本)所缺少的内容。
这一切都在
kafka
主要依赖项内(scala/kafka/server/KafkaConfig.scala
所在的地方)。这是依赖项之一(也许甚至在传递性依赖项中=您没有明确指定)。
另一个依赖项是具有 CompressionType 类的依赖项。这是
kafka-clients
。
kafka-clients 必须与核心 Kafka 库 (kafka) API 兼容,这样它们就可以一起工作,否则……你会遇到这个讨厌的
java.lang.NoSuchFieldError: id
错误。