【发布时间】:2021-01-06 21:05:57
【问题描述】:
我正在尝试在 2 个不同的 Spring Boot 应用程序之间实现一个简单的 Kafka 通信,没有任何特殊设置,这个应用程序只有一个 kafkalistener。我对消费者的 yml 如下:
spring:
kafka:
bootstrap-servers: ip_here
topic:
json: topic_here
consumer:
group-id: group_id
auto-offset-reset: earliest
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
properties:
spring:
json:
trusted:
packages: 'com.example.kw.dtos.Classdata'
我收到的错误如下:
引起:java.lang.IllegalArgumentException:类 'com.example.kw.dtos.Classdata' 不在受信任的包中: [java.util, java.lang, com.example.kw.dtos.Classdata]。如果你相信 这个类可以安全地反序列化,请提供它的名称。如果 序列化仅由受信任的来源完成,您也可以启用 信任所有 (*)。
包在受信任的包中,但有问题。
我的工厂班:
@Configuration
@EnableKafka
public class MsgListener {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServers;
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "json");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put(JsonDeserializer.TRUSTED_PACKAGES, "com.example.kw.dtos.Classdata");
return props;
}
@Bean
public ConsumerFactory<String, Classdata> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(
consumerConfigs(),
new StringDeserializer(),
new JsonDeserializer<>(Classdata.class));
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, Classdata> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, Classdata> factory =
new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
}
【问题讨论】:
-
你在哪里使用受信任的包属性?
-
我没有在任何地方使用它。
-
您是否可以将代码添加到创建 kafka 消费者工厂的位置?
-
我刚刚添加了一个工厂类。它不见了。受信任的包是否也应该存在于生产者中???
-
你是在创建一个 java 对象的 json 表示然后生成,然后在消费从 json 字符串转换回 java 对象时?