Как отправить несколько типов классов в источник потока Spring - PullRequest
0 голосов
/ 25 июня 2019

Я обновил свой весенний поток с 1.3.0 до 2.1.2, и сериализатор по умолчанию был изменен с Kyro (устарел) на Джексона.

У меня есть тема kafka, в которой может быть несколько типов сообщенийотправлено в.В Kyro я использовал его для десериализации в Object.class, а затем приводил к соответствующему типу класса.

С Джексоном я не могу достичь этой функциональности, потому что мне нужно указать тип класса, который я хочузаранее десериализовать, иначе он был десериализован в строку.

Я пытался найти пример, но ничего не смог найти.Любые идеи, как я могу достичь той же функциональности?Я хочу сделать его максимально эффективным.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Вы можете добавить подсказки к кодировке Джексона, чтобы она декодировалась в нужный тип бетона:

@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]

См. здесь .

0 голосов
/ 25 июня 2019

Вы все еще можете использовать Kryo, если хотите.Вы можете просто добавить его вручную, используя @StreamMessageConverter - https://cloud.spring.io/spring-cloud-stream/spring-cloud-stream.html#spring-cloud-stream-overview-user-defined-message-converters.

Что касается «С Джексоном, я не могу достичь этой функциональности, потому что мне нужно указать тип класса ...»- это не точно, так как тип класса выбирается из сигнатуры метода-обработчика, и он прозрачен для вас как пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...