Spring Kafka: JsonDeserializer не принимает конфигурацию TRUSTED_PACKAGE - PullRequest
1 голос
/ 08 марта 2020

Я просто хочу проверить, известно ли это поведение или я делаю что-то не так.

Я настраиваю производителя и потребителя с помощью пользовательского сопоставления типов с использованием JsonDeserializer.

Потребитель не справляется с

org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition ticket-1 at offset 1. If needed, please seek past the record to continue consumption.
Caused by: java.lang.IllegalArgumentException: The class 'createTicket' is not in the trusted packages: [java.util, java.lang]. If you believe this class is safe to deserialize, please provide its name. If the serialization is only done by a trusted source, you can also enable trust all (*).

Заводская конфигурация потребителя

props.put(JsonDeserializer.TRUSTED_PACKAGES, "*");
props.put(JsonDeserializer.TYPE_MAPPINGS, "createTicket:com.example.application.domain.command.CreateTicket, createTicketCommand:com.example.application.domain.command.CreateTicketCommand");

Заводская конфигурация производителя

props.put(JsonSerializer.TYPE_MAPPINGS,
              "createTicket:com.example.application.domain.command.CreateTicket, createTicketCommand:com.example.application.domain.command.CreateTicketCommand");

Я тестировал стабильную версию и версию M3. Пример полного запуска https://github.com/gAmUssA/spring-kafka-question-from-chat

1 Ответ

1 голос
/ 08 марта 2020

Проблема в том, что вы на самом деле не настраиваете JsonDeserializer.

JsonDeserializer.TYPE_MAPPINGS, которые должны быть переданы JsonDeserializer напрямую, а не ConsumerFactory. Ваш код должен выглядеть следующим образом:

        JsonDeserializer<Object> jsonDeserializer = new JsonDeserializer<>();
        Map<String, Object> deserProps = new HashMap<>();
        deserProps.put(JsonDeserializer.TYPE_MAPPINGS,
                "createTicket:com.example.application.domain.command.CreateTicket, createTicketCommand:com.example.application.domain.command.CreateTicketCommand");

//mind this `false` -- they have different modes for key and value deserializers
        jsonDeserializer.configure(deserProps, false);
        return new DefaultKafkaConsumerFactory<>(props, new StringDeserializer(),
                jsonDeserializer);

(на моей машине он работает без каких-либо настроек TRUSTED_PACKAGES)

...