我将Spring Stream从1.3.0升级到2.1.2,默认的序列化程序从Kyro(已弃用)更改为Jackson。
我有一个kafka主题,可以发送多种消息。我曾经使用Kyro将其反序列化为Object.class,然后将其转换为相关的类类型。
使用jackson时,我无法实现此功能,因为我必须预先指定要反序列化的类的类型,否则,它将被反序列化为字符串。
我试图找到一个例子,但找不到任何东西。有什么想法可以实现相同的功能吗?我想使其尽可能高效。
答案 0 :(得分:0)
如果需要,您仍然可以使用Kryo。您只需使用@StreamMessageConverter
-https://cloud.spring.io/spring-cloud-stream/spring-cloud-stream.html#spring-cloud-stream-overview-user-defined-message-converters手动添加即可。
关于“使用杰克逊,我无法实现此功能,因为我必须指定类的类型。 -这是不准确的,因为类的类型是从处理程序方法的签名中提取的,并且对于用户而言是透明的。
答案 1 :(得分:0)
您可以在Jackson编码中添加提示,以便将其解码为正确的具体类型:
@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]
请参见here。