I have some confusion around deserialisation of a message from RabbitMQ - using Spring Boot.
So I've read that I need to configure RabbitListenerConfigurer
so in my application I have implemented it like so:
class Application : RabbitListenerConfigurer {
...
override fun configureRabbitListeners(registrar: RabbitListenerEndpointRegistrar) {
registrar.messageHandlerMethodFactory = messageHandlerMethodFactory()
}
@Bean
fun messageHandlerMethodFactory(): MessageHandlerMethodFactory {
val messageHandlerMethodFactory = DefaultMessageHandlerMethodFactory()
messageHandlerMethodFactory.setMessageConverter(consumerJackson2MessageConverter())
return messageHandlerMethodFactory
}
@Bean
fun consumerJackson2MessageConverter(): MappingJackson2MessageConverter {
return MappingJackson2MessageConverter()
}
}
Then the code doing the listening looks like:
@JsonIgnoreProperties(ignoreUnknown = true)
data class MyModel (
val id : String,
val s3FilePath : String
)
@Service
class Listener {
@RabbitListener(queues = ["\${new.queue}"])
fun action(data: MyModel) {
println("Received message: {$data} from app1 queue.")
}
}
However in the RabbitMQ Management tool, whenever I publish the message
{
"incoming": "data",
"id": "32132",
"s3FilePath": "somefile.mp3"
}
I keep getting the error:
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.work.MyModel` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{
"incoming": "data",
"id": "32132",
"s3FilePath": "somefile.mp3"
Any ideas whats going wrong?
Thanks