I have one module (let's call it Producer) which cannot depend on Spring Boot. It sends Messages to ActiveMQ:
MyCustomDto msg = ...
String json = new ObjectMapper().writeValueAsString(msg); // this is where my I serialize the object to json
TextMessage message = session.createTextMessage(json); // activeMQ session
producer.send(message); // activeMQ producer
Another Module (Consumer) is a Spring Boot service and reads the Messages from ActiveMQ:
@JmsListener(destination = "topic1")
public void processToDo(MyCustomDto amqMessage) {
log.info("I just received a message");
}
Notice that both - the message which was sent and the message which was received - should be a MyCustomDto and should therefore be compatible.
This is the exception:
org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method could not be invoked with incoming message
Endpoint handler details:
Method [public void ...Consumer.processToDo(MyCustomDto)]
Bean [...Consumer@2d5399b4]
; nested exception is org.springframework.messaging.converter.MessageConversionException: Cannot convert from [java.lang.String] to [MyCustomDto] for org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage@a882178, failedMessage=org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage@a882178
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:77) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:736) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:696) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1179) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1076) ~[spring-jms-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
which makes sense because TextMessage is a String (a JSON-String though) but a MyCustomDto Object is expected.
Is there a way to serialize the DTO by hand so Spring Boot can map it automatically?