sdk-java icon indicating copy to clipboard operation
sdk-java copied to clipboard

Spring CloudEventMessageConverter produce a null pointer exception if initial message header map is null

Open dade-hms opened this issue 10 months ago • 0 comments

Step to reproduce

Declare a Rabbit templating using converter

@Bean
public RabbitMessagingTemplate rabbitMessagingTemplate(RabbitTemplate rabbitTemplate, CloudEventMessageConverter cloudEventMessageConverter) {
	var rmt = new RabbitMessagingTemplate(rabbitTemplate);
	rmt.setMessageConverter(cloudEventMessageConverter);
	return rmt;
}

Use it to publish a message

rabbitMessagingTemplate.convertAndSend("my.routing.key", CloudEventBuilder.v1()
				.withId(UUID.randomUUID().toString())
				.withType("mytype")
				.withSource(new URI("my:urisource"))
				.withData(new BytesCloudEventData("{\"data\":\"test\"}".getBytes()))
				.build());

Result

NPE

java.lang.NullPointerException: Cannot invoke "java.util.Map.size()" because "m" is null

	at java.base/java.util.HashMap.putMapEntries(HashMap.java:495)
	at java.base/java.util.HashMap.putAll(HashMap.java:783)
	at io.cloudevents.spring.messaging.MessageBuilderMessageWriter.<init>(MessageBuilderMessageWriter.java:45)
	at io.cloudevents.spring.messaging.CloudEventMessageConverter.toMessage(CloudEventMessageConverter.java:54)
	at org.springframework.messaging.core.AbstractMessageSendingTemplate.doConvert(AbstractMessageSendingTemplate.java:177)
	at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:150)
	at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:129)
	at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:122)

Solution

In call to io.cloudevents.spring.messaging.CloudEventMessageConverter#toMessage, the provided headers field can be null if caller didn't provide custom headers. A null check should be done and MessabeBilderMessageWriter should be called with default constructor in that case.

Workaround

use RabbitMessagingTemplate send methods that take a map as parameter

dade-hms avatar Apr 02 '25 12:04 dade-hms