使用Kafka JSON Schema Registry时遇序列化器实例化错误求助
问题描述
我正在构建一个向Kafka Topic发布JSON消息的应用,该Topic已启用Schema Registry。遵循官方文档开发时,出现以下错误:
Caused by: org.apache.kafka.common.KafkaException: Could not instantiate class io.confluent.kafka.serializers.json.KafkaJsonSchemaSerializer at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:399) at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstance(AbstractConfig.java:401) at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstance(AbstractConfig.java:436) at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstance(AbstractConfig.java:421) at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:388) ... 34 common frames omitted Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:395) ... 38 common frames omitted Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/datatype/guava/GuavaModule at io.confluent.kafka.serializers.json.AbstractKafkaJsonSchemaSerializer.<init>(AbstractKafkaJsonSchemaSerializer.java:43) at io.confluent.kafka.serializers.json.KafkaJsonSchemaSerializer.<init>(KafkaJsonSchemaSerializer.java:43) ... 43 common frames omitted Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.datatype.guava.GuavaModule at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 45 common frames omitted
当前使用的Maven依赖:
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>io.confluent</groupId> <artifactId>kafka-schema-registry-client</artifactId> <version>7.1.1</version> </dependency> <dependency> <groupId>io.confluent</groupId> <artifactId>kafka-json-schema-serializer</artifactId> <version>7.1.1</version> </dependency>
生产者代码:
@Bean public KafkaProducer<String, Object> jsonKafkaProducer() { Properties configProps = new Properties(); configProps.put(ProducerConfig.CLIENT_ID_CONFIG, CLIENT_ID); configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); configProps.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, SECURITY_MECHANISM); configProps.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, SSL_TYPE); configProps.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, kafkaTruststore); configProps.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, kafkaTruststorePassword); configProps.put(SslConfigs.SSL_KEYSTORE_TYPE_CONFIG, SSL_TYPE); configProps.put(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG, kafkaKeystore); configProps.put(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG, kafkaKeystorePassword); configProps.put(ProducerConfig.ACKS_CONFIG, "all"); configProps.put(ProducerConfig.RETRIES_CONFIG, 3); configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, io.confluent.kafka.serializers.json.KafkaJsonSchemaSerializer.class); configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, org.apache.kafka.common.serialization.StringSerializer.class); configProps.put("auto.register.schemas", false); configProps.put("schema.registry.url", schemaRegistryUrl); configProps.put("basic.auth.credentials.source", basicAuthCredSrc); configProps.put("basic.auth.user.info", basicAuthUserInfo); return new KafkaProducer<String, Object>(configProps); }
解决方案
错误核心是缺少Jackson Guava模块依赖,KafkaJsonSchemaSerializer内部依赖com.fasterxml.jackson.datatype.guava.GuavaModule,但当前依赖未引入该模块。
修复步骤
在Maven依赖中添加Jackson Guava模块:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-guava</artifactId> <version>2.13.3</version> <!-- 版本需匹配项目中Jackson统一版本,Confluent 7.1.1默认依赖Jackson 2.13.x --> </dependency>
补充说明
- 确保所有Jackson相关依赖版本一致,避免版本冲突。可通过Maven命令
mvn dependency:tree查看依赖树,确认Jackson版本后调整guava模块版本。 - 检查是否有其他依赖排除了Jackson的guava模块,若有需调整排除规则。
内容的提问来源于stack exchange,提问作者Puneet Sharma
相关产品推荐
相关产品推荐

