0

I created a JMSListener which listens an AWS SQS queue. I receive message successfully but I cannot deserialize received message to a class without default values.

This is my queue listener function:

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

...and class:

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

Function cannot parse deserialize text to SQSMessageDto unless I give default values for fields.

What I tried?

It works when I add a breakpoint in debugger mode on io.micronaut.jms.serdes.DefaultSerializerDeserializer and register Jackson's KotlinModule manually. (OBJECT_MAPPER.registerModule(new KotlinModule())) But I don't know how to make it properly.

Error Message:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.example.sqs.SQSMessageDto (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (String)"{.......}"]

kamer
  • 43
  • 1
  • 7

1 Answers1

1

just use a BeanCreatedEventListener<ObjectMapper> like shown here: https://stackoverflow.com/a/53195504/7776688

@Singleton
static class ObjectMapperBeanEventListener implements BeanCreatedEventListener<ObjectMapper> {

    @Override
    public ObjectMapper onCreated(BeanCreatedEvent<ObjectMapper> event) {
        final ObjectMapper mapper = event.getBean();
        mapper.registerModule(new KotlinModule())
        return mapper;
    }
}
Roar S.
  • 8,103
  • 1
  • 15
  • 37
IEE1394
  • 1,181
  • 13
  • 33