问题描述
我创建了一个 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;
}
}