web-dev-qa-db-ja.com

クラスは信頼できるパッケージのリストに表示されますが、信頼できるパッケージにはありません

私は単純なKafka通信を、特別な設定なしで2つの異なるSpring Bootアプリケーション間で実装しようとしています。このアプリケーションにはkafkalistenerが1つしかありません。コンシューマーの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;
    }
}
9
HeyItsMe

ただのパッケージcom.example.kw.dtos

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

Kafkaのテスト中にこの問題が発生しました。そのように修正しました:

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

  final JsonDeserializer<VoterData> 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);
}
2
Haagy

ここでの秘訣は、2つの場所に設定する必要があることです。

  • spring.json.trusted.packages-カフカの影響の外で作成されたjsonデシリアライザの場合
  • spring.kafka.consumer.properties.spring.json.trusted.packages-kafka作成されたデシリアライザ

これが私がそれを機能させることができた唯一の方法でした。また、ワイルドカードを受け入れないため、パッケージと完全に一致する必要があります

0
Ján Srniček