该类不在受信任的软件包中,但出现在受信任的软件包列表中

Hey*_*sMe 6 spring-boot spring-kafka

我正在尝试在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'
Run Code Online (Sandbox Code Playgroud)

我收到的错误如下:

原因: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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gar*_*ell 7

应该只是包 com.example.kw.dtos

String packageName = ClassUtils.getPackageName(requestedType).replaceFirst("\\[L", "");
for (String trustedPackage : this.trustedPackages) {
    if (packageName.equals(trustedPackage)) {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当使用带有与生产者发送的对象不同的对象的 `@KafkaListener` 时,您应该使用带有 `StringDeserializer` 或 `ByteArrayDeserializer` 的 `StringJsonMessageConverter` 而不是 `JsonDeserializer` - 参见 [this answer](https:/ /stackoverflow.com/questions/50478267/classnotfoundexception-with-kafka-consumer/50489352#50489352)。实际参数类型被传递到转换器中。 (2认同)