将 Jackson KotlinModule 添加到 Micronaut JMS

问题描述

我创建了一个 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 的实例(没有创建者, 像认构造函数一样,存在):不能从对象值反序列化 (没有基于委托或基于属性的创建者)在 [来源: (字符串)“{.......}”]

解决方法

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

@单身人士 静态类 ObjectMapperBeanEventListener 实现 BeanCreatedEventListener {

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