【问题标题】:The class is not in the trusted packages although appears in the list of trusted packages该类不在受信任的包中,但出现在受信任的包列表中
【发布时间】: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 对象时?

标签: spring-boot spring-kafka


【解决方案1】:

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

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

【讨论】:

  • 这确实有效,但现在因为我使用不同的包名,所以出现 MessageConversionException: failed to resolve class name.
  • 当使用@KafkaListener 与生产者发送的对象不同时,您应该使用StringJsonMessageConverterStringDeserializerByteArrayDeserializer 而不是JsonDeserializer - 请参阅@ 987654321@。实际参数类型传入转换器。
【解决方案2】:

我们在测试 kafka 时遇到了这个问题。 我们是这样解决的:

private static KafkaMessageListenerContainer<String, Data> createMessageListenerContainer() {
  final Map<String, Object> consumerProps = KafkaTestUtils.consumerProps("sender", "false", EMBEDDED_KAFKA);
  final DefaultKafkaConsumerFactory<String, Data> consumerFactory = new DefaultKafkaConsumerFactory<>(consumerProps);

  final JsonDeserializer<Data> valueDeserializer = new JsonDeserializer<>();
  valueDeserializer.addTrustedPackages("path.to.package");

  consumerFactory.setValueDeserializer(valueDeserializer);
  consumerFactory.setKeyDeserializer(new StringDeserializer());

  final ContainerProperties containerProperties = new ContainerProperties(SENDER_TOPIC);
  return new KafkaMessageListenerContainer<>(consumerFactory, containerProperties);
}

【讨论】:

    【解决方案3】:

    这里的诀窍是你必须在两个地方设置它

    • spring.json.trusted.packages - 适用于在 kafka 影响之外创建的任何 json 反序列化器
    • spring.kafka.consumer.properties.spring.json.trusted.packages - 用于 kafka 创建的反序列化器

    这是我能够使它工作的唯一方法。另外,它不接受通配符,所以它必须是完全匹配的包

    【讨论】:

    • 第一个配置产生The configuration 'spring.json.trusted.packages' was supplied but isn't a known config. - {} 。似乎不需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2019-07-05
    • 2021-10-30
    • 2019-05-26
    • 2011-04-16
    相关资源
    最近更新 更多