如何将多种类型的类发送到Spring流源

时间:2019-06-25 12:21:48

标签: jackson spring-cloud spring-kafka spring-cloud-stream

我将Spring Stream从1.3.0升级到2.1.2,默认的序列化程序从Kyro(已弃用)更改为Jackson。

我有一个kafka主题,可以发送多种消息。我曾经使用Kyro将其反序列化为Object.class,然后将其转换为相关的类类型。

使用jackson时,我无法实现此功能,因为我必须预先指定要反序列化的类的类型,否则,它将被反序列化为字符串。

我试图找到一个例子,但找不到任何东西。有什么想法可以实现相同的功能吗?我想使其尽可能高效。

2 个答案:

答案 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