【问题标题】:How to send multiple types of classes into Spring stream source如何将多种类型的类发送到 Spring 流源中
【发布时间】:2019-11-07 06:53:03
【问题描述】:

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

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

使用jackson我无法实现这个功能,因为我必须提前指定要反序列化的类的类型,否则,它被反序列化为字符串。

我试图找到一个例子,但找不到任何东西。任何想法如何实现相同的功能?我想让它尽可能高效。

【问题讨论】:

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


    【解决方案1】:

    如果你愿意,你仍然可以使用 Kryo。您可以使用 @StreamMessageConverter- https://cloud.spring.io/spring-cloud-stream/spring-cloud-stream.html#spring-cloud-stream-overview-user-defined-message-converters 手动添加它。

    关于“使用jackson我无法实现这个功能,因为我必须指定类的类型......” - 这是不准确的,因为类的类型是从处理程序方法的签名中获取的,并且它对您作为用户是透明的。

    【讨论】:

      【解决方案2】:

      您可以向 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

      【讨论】:

      • 谢谢。像魅力一样工作。您不需要指定“include”和“property”,因为它们是默认值
      猜你喜欢
      • 2011-03-04
      • 2017-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2018-08-05
      相关资源
      最近更新 更多