【问题标题】:Adding Jackson KotlinModule to Micronaut JMS将 Jackson KotlinModule 添加到 Micronaut JMS
【发布时间】:2021-04-13 14:41:39
【问题描述】:

我创建了一个 JMSListener 来监听 AWS SQS 队列。我成功接收到消息,但我无法将接收到的消息反序列化为没有默认值的类。

这是我的队列监听函数:

@Queue(value = "queuename", concurrency = "1-10", acknowledgeMode = JMSContext.CLIENT_ACKNOWLEDGE)
fun receive(@MessageBody sqsMessage: SQSMessageDto) {
    ....
}

...和类:

class SQSMessageDto(
    val notificationType: String,
    val mail: Mail,
    val receipt: Receipt
)

除非我为字段提供默认值,否则函数无法将反序列化文本解析为 SQSMessageDto。

我尝试了什么?

当我在 io.micronaut.jms.serdes.DefaultSerializerDeserializer 的调试器模式下添加断点并手动注册 Jackson 的 KotlinModule 时,它​​可以工作。 (OBJECT_MAPPER.registerModule(new KotlinModule())) 但我不知道如何正确制作。

错误信息:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 不能 构造com.example.sqs.SQSMessageDto 的实例(没有创作者, 像默认构造函数,存在):不能从对象值反序列化 (没有基于委托或基于属性的创建者)在 [来源: (字符串)“{.......}”]

【问题讨论】:

    标签: kotlin jackson micronaut


    【解决方案1】:

    只需使用BeanCreatedEventListener<ObjectMapper> 如下所示:https://stackoverflow.com/a/53195504/7776688

    @Singleton 静态类 ObjectMapperBeanEventListener 实现 BeanCreatedEventListener {

        @Override
        public ObjectMapper onCreated(BeanCreatedEvent<ObjectMapper> event) {
            final ObjectMapper mapper = event.getBean();
            mapper.registerModule(new KotlinModule())
            return mapper;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 2012-01-21
      • 2010-11-25
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 2012-11-25
      • 2016-05-10
      相关资源
      最近更新 更多