You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
CloudEvents incompatiable with Spring-framework 7.x #704
I know there is a similar issue up already about upgrading to Spring-boot 2.7.18 but this project has lagged so far behind now that you can't even launch it with using an up-to-date ecosystem since Spring Framework 7 introduced a breaking change:
HttpHeaders changes
The HttpHeaders API has been revisited in 7.0. This class no longer extends the MultiValueMap contract. Underlying servers treat headers more like a collection of pairs, and many map-like operations do not behave or perform well, because headers are case-insensitive in the first place. We therefore removed several methods as a result and introduced fallbacks as immediately @deprecated, like HttpHeaders#asMultiValueMap. Please consider other methods as much as possible. See #33913 for more details.
Stacktrace you get when running latest release of cloudevent and you try to receive a message: "Class org.springframework.http.HttpHeaders does not implement the requested interface java.util.Map","error.stack_trace":"java.lang.IncompatibleClassChangeError: Class org.springframework.http.HttpHeaders does not implement the requested interface java.util.Map\n\tat io.cloudevents.http.HttpMessageFactory.lambda$createReaderFromMultimap$5(HttpMessageFactory.java:112)\n\tat io.cloudevents.http.HttpMessageFactory.createReader(HttpMessageFactory.java:70)\n\tat io.cloudevents.http.HttpMessageFactory.createReaderFromMultimap(HttpMessageFactory.java:114)\n\tat io.cloudevents.spring.http.CloudEventHttpUtils.toReader(CloudEventHttpUtils.java:55)\n\tat io.cloudevents.spring.mvc.CloudEventHttpMessageConverter.readInternal(CloudEventHttpMessageConverter.java:54)\n\tat io.cloudevents.spring.mvc.CloudEventHttpMessageConverter.readInternal(CloudEventHttpMessageConverter.java:39)\n\tat org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:196)\n\tat
The CloudEvents HTTP reader expects a Map<String, List<String>>, so applications running Spring Framework 7 fail while deserializing inbound CloudEvents with:
java.lang.IncompatibleClassChangeError:
Class org.springframework.http.ReadOnlyHttpHeaders does not implement
the requested interface java.util.Map
In WebFlux, Reactor treats this linkage error as fatal. The HTTP exchange can remain incomplete, causing callers such as WebTestClient to report a timeout instead of the underlying exception.
Impact
Inbound structured and binary CloudEvent handling fails on Spring Framework 7.
Both Spring MVC and WebFlux CloudEvents HTTP readers are affected because they use the shared CloudEventHttpUtils.toReader(...) implementation.
Outbound CloudEvent serialization is not affected by this specific issue.
Temporary Application Workaround
Until a CloudEvents SDK release includes the upstream fix, applications can register a compatible HttpMessageReader<CloudEvent> that copies request headers into a standard mutable Map<String, List<String>> before invoking HttpMessageFactory.createReaderFromMultimap(...).
PR #739 updates CloudEventHttpUtils.toReader(...) to copy HttpHeaders entries into a regular map before passing them to the CloudEvents HTTP message factory.
The fix is merged but is not included in the currently released 4.1.1 artifact.
Spring Boot 4.x / Spring Framework 7 CloudEvents Workaround (Detailed)
This write-up documents the workaround we applied while running on Spring Boot 4.x (Spring Framework 7) with io.cloudevents:cloudevents-spring:4.1.1.
Problem Summary
Spring Framework 7 changed HttpHeaders so it no longer implements the Map / MultiValueMap contract expected by older CloudEvents Spring reader code paths.
CloudEvents 4.1.1 still routes inbound requests through logic equivalent to:
Activity
Stromner commentedon Dec 17, 2025
Created fork to update to Spring Framework 7 and JDK 25; so we've a plan on our end how to do this if you were to reject the PR that I will create.
ranma2913 commentedon Jul 13, 2026
#739 provided some changes.
What's left for this Issue?
I've got these issues too:
Spring Framework 7
HttpHeadersCompatibilitySpring Framework 7 changed
org.springframework.http.HttpHeadersso it no longer implements theMap/MultiValueMapcontract.Current versions of
io.cloudevents:cloudevents-springpassHttpHeadersdirectly to:The CloudEvents HTTP reader expects a
Map<String, List<String>>, so applications running Spring Framework 7 fail while deserializing inbound CloudEvents with:In WebFlux, Reactor treats this linkage error as fatal. The HTTP exchange can remain incomplete, causing callers such as
WebTestClientto report a timeout instead of the underlying exception.Impact
CloudEventHttpUtils.toReader(...)implementation.Temporary Application Workaround
Until a CloudEvents SDK release includes the upstream fix, applications can register a compatible
HttpMessageReader<CloudEvent>that copies request headers into a standard mutableMap<String, List<String>>before invokingHttpMessageFactory.createReaderFromMultimap(...).Upstream Status
PR #739 updates
CloudEventHttpUtils.toReader(...)to copyHttpHeadersentries into a regular map before passing them to the CloudEvents HTTP message factory.The fix is merged but is not included in the currently released
4.1.1artifact.ranma2913 commentedon Jul 13, 2026
FYI wanted to share my work around:
Spring Boot 4.x / Spring Framework 7 CloudEvents Workaround (Detailed)
This write-up documents the workaround we applied while running on Spring Boot 4.x (Spring Framework 7) with
io.cloudevents:cloudevents-spring:4.1.1.Problem Summary
Spring Framework 7 changed
HttpHeadersso it no longer implements theMap/MultiValueMapcontract expected by older CloudEvents Spring reader code paths.CloudEvents 4.1.1 still routes inbound requests through logic equivalent to:
When
headersis a Spring 7HttpHeadersimplementation, this can fail with:In WebFlux test clients, this can appear as request timeouts because the exchange never completes cleanly.
Workaround Strategy
Instead of using
CloudEventHttpMessageReaderdirectly, register a compatible reader that:MultiValueMap<String, String>.HttpMessageFactory.createReaderFromMultimap(...)with that copied map.1) Compatible Reader (full snippet)
2) WebFlux Codec Registration Change
Upstream Tracking
PR #739 includes the same conceptual fix (copying headers to a regular map before reading).
Planned Cleanup Once Released
After a CloudEvents release containing PR #739 is available in your artifact repositories:
cloudevents.versioninpom.xml.CloudEventHttpMessageReaderregistration.CompatibleCloudEventHttpMessageReader.🐛 Refactor `toReader` method in `CloudEventHttpUtils` to provide a te…
🐛 Refactor `toReader` method in `CloudEventHttpUtils` to provide a te…
jacekbilski commentedon Aug 16, 2026
#746 includes Spring Boot 4/Framework 7 support, I'm working on getting it merged.