Я обновил свой весенний поток с 1.3.0 до 2.1.2, а сериализатор по умолчанию был изменен с Kyro (устаревший) на Jackson.
У меня есть тема кафки, в которую можно отправлять более одного типа сообщений. С Kyro я десериализовал его в Object.class, а затем привел к соответствующему типу класса.
С jackson я не могу реализовать эту функциональность, потому что мне нужно заранее указать тип класса, который я хочу десериализовать, иначе он будет десериализован в строку.
Я пытался найти пример, но ничего не нашел. Любые идеи, как я могу добиться той же функциональности? Я хочу сделать его максимально эффективным.





Вы все еще можете использовать Kryo, если хотите. Вы можете просто добавить его вручную, используя @StreamMessageConverter- https://cloud.spring.io/spring-cloud-stream/spring-cloud-stream.html#spring-cloud-stream-overview-user-defined-message-converters.
Что касается «С Джексоном я не могу реализовать эту функциональность, потому что мне нужно указать тип класса...» - это не точно, так как тип класса выбирается из подписи метода обработчика, и он прозрачен для вас как пользователя.
Вы можете добавить подсказки к кодировке Джексона, чтобы она декодировалась в правильный конкретный тип:
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property = "@class")
@SpringBootApplication
@EnableBinding(Processor.class)
public class So56753956Application {
public static void main(String[] args) {
SpringApplication.run(So56753956Application.class, args);
}
@StreamListener(Processor.INPUT)
public void listen(Foo foo) {
System.out.println(foo);
}
@Bean
public ApplicationRunner runner(MessageChannel output) {
return args -> {
output.send(new GenericMessage<>(new Bar("fiz")));
output.send(new GenericMessage<>(new Baz("buz")));
};
}
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property = "@class")
public static abstract class Foo {
private String bar;
public Foo() {
super();
}
public Foo(String bar) {
this.bar = bar;
}
public String getBar() {
return this.bar;
}
public void setBar(String bar) {
this.bar = bar;
}
@Override
public String toString() {
return getClass().getName() + " [bar = " + this.bar + "]";
}
}
public static class Bar extends Foo {
public Bar() {
super();
}
public Bar(String bar) {
super(bar);
}
}
public static class Baz extends Foo {
public Baz() {
super();
}
public Baz(String bar) {
super(bar);
}
}
}
а также
com.example.So56753956Application$Bar [bar=fiz]
com.example.So56753956Application$Baz [bar=buz]
См. здесь.
Спасибо. Работал как шарм. Вам не нужно указывать «включать» и «свойство», поскольку они используются по умолчанию.