Невозможно десериализовать строку json из темы kafka, которая имеет атрибуты в случае змеи - PullRequest
1 голос
/ 24 октября 2019

Его

Я не могу десериализовать строку json из темы kafka. Атрибуты находятся в смешанном случае змеи и в случае верблюда, например: input:

{
"event_type" : "ABC",
"user_id" : 1567221,
"name" : "HGHAAAB" //here no snake case
"user_contact" : "12345678",
"phoneNumber" : "91222"
} 

Теперь я хочу создать Request DTO на моей стороне, как показано ниже:

public class KafkaRequest { 
private String eventType;
private int userId;
private String name; 
private String userContact;
private String phoneNumber;

//getters and setters

} 

Может любойодин подсказывает, какой должен быть правильный путь? Я попытался создать CustomNameStrategy и десериализовать с помощью ObjectMapper.readValue (), но это не сработало.

Спасибо, заранее !!!

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Если вы используете jackson, вы можете использовать @JsonProperty 6.1. @ JsonProperty

@JsonProperty("event_type")
private String eventType;

Или вы можете установить для свойства PropertyNamingStrategy.SNAKE_CASE значение ObjectMapper

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
0 голосов
/ 24 октября 2019

Вы можете использовать GSON, есть способ определить стратегию имени поля.

Gson gson = new GsonBuilder().disableHtmlEscaping().setFieldNamingStrategy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES).create();

, или даже вы можете определить пользовательское.

Gson gson = new GsonBuilder().disableHtmlEscaping().setFieldNamingStrategy(new FieldNamingStrategy() {
            @Override
            public String translateName(Field f) {
                return f.getName().toLowerCase(); //or any logic
            }
        }).create();

. Для Producer будет работать только StringSerializer

properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

Предположим, что вы уже заполнили POJO, скажем kafkaRequest, тогда вы можете опубликовать

ProducerRecord producerRecord = new ProducerRecord<String, String>("topicName", null, gson.toJson(kafkaRequest));

На стороне потребителя проанализировать обратно в POJO

properties.setProperty("key.deserializer", StringDeserializer.class.getName());
properties.setProperty("value.deserializer", StringDeserializer.class.getName());
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(properties);
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(100);
    for (ConsumerRecord<String, String> record : records) {
         KafkaRequest kafkaRequest = gson.fromJson(record.value(), KafkaRequest.class);
    }
}
...