Spring integration Avro编解码器中的泛型类型处理

Spring integration Avro编解码器中的泛型类型处理,spring-integration,apache-kafka,avro,Spring Integration,Apache Kafka,Avro,我正在使用spring integration kafka发送和接收来自kafka的消息。消息对象基于泛型类型。基类看起来像这样 public abstract class AbstractMessage<T> implements Serializable { ... } 公共抽象类AbstractMessage实现可序列化{ ... } 我希望能够发送和接收这个类的不同实现。我使用的是基于avro反射的编码器和解码器 <bean id="kafkaMessageEnc

我正在使用
spring integration kafka
发送和接收来自kafka的消息。消息对象基于泛型类型。基类看起来像这样

public abstract class AbstractMessage<T> implements Serializable {
 ...
}
公共抽象类AbstractMessage实现可序列化{
...
}
我希望能够发送和接收这个类的不同实现。我使用的是基于avro反射的编码器和解码器

<bean id="kafkaMessageEncoder"
    class="org.springframework.integration.kafka.serializer.avro.AvroReflectDatumBackedKafkaEncoder">
    <constructor-arg value="com.....model.AbstractMessage" />
</bean>

<bean id="kafkaMessageDecoder"
    class="org.springframework.integration.kafka.serializer.avro.AvroReflectDatumBackedKafkaDecoder">
    <constructor-arg value="com.....model.AbstractMessage" />
</bean>

此操作失败并出现错误

AvroTypeException:未知类型:T

这是有意义的,因为Avro无法确定AbstractMessage类中指定的泛型类型,但后来我决定使用自定义编码器和解码器

public class MessageEncoder implements Encoder<Object> {

@Override
public byte[] toBytes(Object object) {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
        oos.flush();
        oos.close();
        return baos.toByteArray();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "".getBytes();
}

}

public class MessageDecoder implements Decoder<Object> {

@Override
public Object fromBytes(byte[] bs) {
    try {
        ObjectInputStream bais = new ObjectInputStream(new ByteArrayInputStream(bs));
        AbstractMessage<?> message = (AbstractMessage<?>) bais.readObject();
        return message;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
}
public类MessageEncoder实现编码器{
@凌驾
公共字节[]到字节(对象){
试一试{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
ObjectOutputStream oos=新的ObjectOutputStream(BAS);
oos.writeObject(对象);
oos.flush();
oos.close();
返回baos.toByteArray();
}捕获(例外e){
e、 printStackTrace();
}
返回“.getBytes();
}
}
公共类MessageDecoder实现解码器{
@凌驾
公共对象fromBytes(字节[]bs){
试一试{
ObjectInputStream BAI=新的ObjectInputStream(新的ByteArrayInputStream(bs));
AbstractMessage=(AbstractMessage)bais.readObject();
返回消息;
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}
这个很好用

我想我的问题是我在这里没有做什么特别的事。为什么avro不能做同样的事情,并且有不同的avro d/编码器可以序列化/反序列化我的泛型类型对象

谢谢