web-dev-qa-db-fra.com

La classe ne fait pas partie des packages sécurisés bien qu'elle apparaisse dans la liste des packages sécurisés.

J'essaie d'implémenter une simple communication Kafka entre 2 applications Spring Boot différentes sans paramètres spéciaux. Cette application ne possède qu'un seul kafkalistener. Mon yml pour le consommateur est le suivant:

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'

L'erreur que je reçois est la suivante:

Cause: Java.lang.IllegalArgumentException: la classe 'Com.example.kw.dtos.Classdata' ne figure pas dans les packages approuvés: [Java.util, Java.lang, com. exemple.kw.dtos.Classdata]. Si vous pensez que Cette classe peut être désérialisée en toute sécurité, veuillez indiquer son nom. Si la sérialisation Est effectuée uniquement par une source approuvée, vous pouvez également activer Faire confiance à tous (*).

Le paquet est dans les paquets approuvés mais quelque chose ne va pas.

Ma classe d'usine:

@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;
    }
}
3
HeyItsMe

Ce devrait être juste le paquet com.example.kw.dtos

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

Nous avons eu ce problème lors du test de 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);
}
1
Haagy