Apache kafka Kafka自定义反序列化程序转换为Java对象
我使用的是SpringKafka集成,我有自己的值GenericSerializer/deserializer,如下所示 序列化程序:Apache kafka Kafka自定义反序列化程序转换为Java对象,apache-kafka,kafka-consumer-api,spring-kafka,Apache Kafka,Kafka Consumer Api,Spring Kafka,我使用的是SpringKafka集成,我有自己的值GenericSerializer/deserializer,如下所示 序列化程序: 公共类KafkaSerializer实现序列化程序{ 私有对象映射器映射器; @凌驾 公众假期结束(){ } @凌驾 public void configure(最终映射设置、最终布尔值isKey){ 映射器=新的ObjectMapper(); } @凌驾 公共字节[]序列化(最终字符串主题,最终T对象){ 试一试{ 返回mapper.writeValueAsB
公共类KafkaSerializer实现序列化程序{
私有对象映射器映射器;
@凌驾
公众假期结束(){
}
@凌驾
public void configure(最终映射设置、最终布尔值isKey){
映射器=新的ObjectMapper();
}
@凌驾
公共字节[]序列化(最终字符串主题,最终T对象){
试一试{
返回mapper.writeValueAsBytes(对象);
}捕获(最终JsonProcessingException e){
抛出新的IllegalArgumentException(e);
}
}
}
反序列化程序:
公共类KafkaDeserializer实现反序列化程序{
私有对象映射器映射器;
@凌驾
公众假期结束(){
}
@凌驾
public void configure(最终映射设置、最终布尔值isKey){
映射器=新的ObjectMapper();
}
@凌驾
公共T反序列化(最终字符串主题,最终字节[]字节){
试一试{
返回mapper.readValue(字节,新类型引用(){
});
}捕获(最终IOE例外){
抛出新的IllegalArgumentException(e);
}
}
}
序列化程序工作正常,但在使用消息时反序列化值时,我会得到一个
LinkedHashMap
,而不是所需的对象,请告知我哪里出错,提前感谢。某些情况需要确认:
序列化程序
正常工作反序列化程序
可以正常工作,但它返回的是一个LinkedHashMap
,而不是您期望的对象,对吗?您无法将该LinkedHashMap
转换为您的对象
ObjectMapper
。如果所有情况都能得到证实,我发现这里有一个很好的帖子可以回答你的问题
mapper.convertValue(desiredObject,new TypeReference(){})
ObjectMapper
的API位于[此处](,com.fasterxml.jackson.core.type.TypeReference))
我希望我不会错过你的意图,你可以补充必要的情况,这样某人或我可以改进这个答案 感谢您的回复,但是我的序列化程序工作起来很好,可以将我的对象转换为(JSON)字节,是的,反序列化程序正在将我的对象转换为LinkedHashMap,这应该是所需的对象,如果我需要将LinkedHashMap转换为所需的对象,那么使用自定义反序列化程序有什么意义,我可以使用StringDeserializer并使用ObjectMapper
mapper将获得的JSON(作为字符串)转换为所需的对象。convertValue(desiredObject,new TypeReference(){})是否有效?是的,有效,但这是用户收到消息后需要的手动步骤,理想情况下,消费者应该获得所需的对象,在我的情况下,这是用户对象,而不是LinkedHashMap的对象。现在,我知道你想将用户对象转移到下游,好吗。前一个code
完成了你的工作吗?我认为前一个代码是解决这个问题的一个变通方法。Spring Kafka已经提供了将JSON转换为Java对象的类。@ChinHuang,谢谢你的回复,但我需要一个通用的使用者,我猜JsonDeserializer构造函数采用了应该解析响应的类类型,那么,我如何利用它呢?@阿波罗——你是如何解决这个泛型消费者的问题的?@ Mubin,实际上我遵循非常天真的方法,我使用String RetrialAlgisher从主题中获取消息作为字符串,然后转换为所需的对象,但是,你可以考虑AVRO的相同(我后来遇到的)感谢的信息@阿波罗。
public class KafkaSerializer<T> implements Serializer<T> {
private ObjectMapper mapper;
@Override
public void close() {
}
@Override
public void configure(final Map<String, ?> settings, final boolean isKey) {
mapper = new ObjectMapper();
}
@Override
public byte[] serialize(final String topic, final T object) {
try {
return mapper.writeValueAsBytes(object);
} catch (final JsonProcessingException e) {
throw new IllegalArgumentException(e);
}
}
}
public class KafkaDeserializer<T> implements Deserializer<T> {
private ObjectMapper mapper;
@Override
public void close() {
}
@Override
public void configure(final Map<String, ?> settings, final boolean isKey) {
mapper = new ObjectMapper();
}
@Override
public T deserialize(final String topic, final byte[] bytes) {
try {
return mapper.readValue(bytes, new TypeReference<T>() {
});
} catch (final IOException e) {
throw new IllegalArgumentException(e);
}
}
}
mapper.convertValue(desiredObject, new TypeReference<type-of-desiredObject>() { })