⭐ New Features
- Provide default codecs config callback to custom codecs #24118
- Add protobuf MessageConverter #24087
- Refine Throwable handling in spring-websocket #24075
- Improve part content type determination in MockMultipartHttpServletRequest #24074
- Cache result of String.getBytes() in ExtendedBeanInfo.PropertyDescriptorComparator #24072
- Use String.isEmpty() instead of String.equals("") #24052
- IOException "Closed while Pending/Unready" with WebFlux on Jetty #24050
- Avoid substring allocation in StringUtils.replace #24023
- Use
@MessageMapping
method signature to constrain RSocket interaction model #23999 - Avoid indefinite wait to connect in JettyWebSocketClient #23994
- Add queryParam method to MockHttpServletRequestBuilder #23980
- Fallback locale other than the system locale in AbstractResourceBasedMessageSource #23977
- Support for new MySQL 8 error code 3572 #23972
- Simplify ConstructorResolver: do not sort intermediate array #23969
- Avoid store all beanName in ApplicationListenerDetector #23965
- Allow ExchangeStrategies customizations in WebClient #23961
- Use Method::getParameterCount where possible #23949
- Align implementations of StringToUUIDConverter and UUIDEditor #23940
- Use "non-blocking" thread for server-less tests in WebTestClient #23936
- Avoid default Accept header from HttpUrlConnection in RestTemplate with put and delete #23740 #23855
- Reject "%2F" as an invalid sequence in simp messaging usernames #23836
- ApplicationListenerMethodAdapter: gracefully handle beans which are actually NullBean #23784
- Provide orNull extensions for WebFlux ServerRequest #23761
- MockMvc Kotlin DSL should support async dispatch #23758
- RSocketRequestSpec handling metadata values that is a Publisher type #23640
- Preserve the originalMessage when creating an ErrorMessage in MessageBuilder #23417
- Add an option to not include Charset in the final http request ContentType Header #22971
- Allow sending headers with the disconnect frame #22715
- Avoid String concatenation for lookup in StaticMessageSource #22451
- Keys for form data in FormHttpMessageConverter must not be null #22372
- XpathResultMatcher supports Hamcrest Matcher NodeList #2023
- Error details in RestTemplate client and server exceptions #1956
- Preserve "type" parameter in media type for Atom Feed/Entry message conversion #1885
🪲 Bug fixes
- Null pointer when connecting to RSocket #24088
- Regression:
@Inherited
annotations declared in superclass are not recognized anymore #24077 - RSocketRequester allows specifying data more than once #24073
- Revise AbstractBeanDefinition equals implementation #24048
- SqlRowSet accessor methods should be marked
@Nullable
#24042 - Unsafe invocation of .value() on annotations in SynthesizedMergedAnnotationInvocationHandler prevents backwards-compatible additions to annotations #24029
- InMemoryWebSessionStore makes blocking calls to UUID.randomUUID #24027
- ControllerAdviceBean.findAnnotatedBeans() finds proxies as well as their target beans, resulting in double registration #24017
- NullPointerException in JSON codec parsing stream encoded with Jackson Smile #24009
- Fix inappropriate eager init. #23992
- Calling MethodParameter.isOptional() for Kotlin Continuation parameter fails with IndexOutOfBoundsException #23991
- Regression: ControllerAdviceBean#getOrder() causes BeanCreationException for request scoped advice beans #23985
- TestDispatcherServlet ambiguous handler methods with consumes condition and body not required #23978
- AbstractRequestLoggingFilter.getHeaderPredicate is accidentally public #23976
- Reading 'null' JSON response via WebClient fails in v5.2.x #23935
- Allow schemaZip Gradle task to execute on MS Windows #23933
- Regression: AnnotationUtils.findAnnotation no longer finds non-inherited "java." annotations on superclasses #23929
- ResponseCookie to allow leading dot in domain name again #23924
- Regression in spring-test's 5.2.1 MockCookie parse implementation #23911
- useSuffixPatternMatch ignored if pathPrefix is also used #23907
- Ensure InstantFormatter can properly deserialize ISO-formatted dates #23895
- Fix RSocket Fire and forget handling with Kotlin #23866
- SpEL cannot invoke Kotlin synthetic classes #23812
- ShallowETagHeaderFilter overwrites ETag #23775
- Corrupted multipart + correct content-length lead to
Flux<Part>
hanging #23768
📔 Documentation
- [.] is displayed as [bold .] ,need to escape #24108
- Fix consecutive-word duplications in documentation #24089
- Examples in Data Access chapter declare unused JdbcTemplate fields #24085
- Data Access chapter 3.5.1 uses bad pattern #24084
- Documentation flaw for
<tx:method/>
settings #24080 - Fix errors in documentation #24008
- TypeDescriptor#getElementTypeDescriptor does not throw IllegalStateException anymore #23996
- Update docs on ShallowEtagHeaderFilter with regards to ASYNC dispatches #23958
- DEFAULT_PHASE of SmartLifecycle interface has incorrect Javadoc #23956
- Documentation for ForwardedHeaderFilter does not mention important filter order #23954
- Different behavior when injecting beans from local
@Configuration
class vs. external@Configuration
classes #23934 - Correct Javadoc for WebMvcConfigurer#addInterceptors #23922
- Improve WebClient.Builder::filter documentation #23342
🔨 Dependency upgrades
❤️ Contributors
We’d like to thank all the contributors who worked on our current release!
- @ryenus
- @parviz-93
- @samarthrastogi
- @sap-nocops
- @chtompki
- @jerzykrlk
- @monosoul
- @izeye
- @GungnirLaevatain
- @suztomo
- @yokotaso
- @SchutzeHades
- @wonwoo
- @Syquel
- @y987425112
- @L00kian
- @dreis2211
- @ikempf
- @denisgalaybo
- @facewindu
- @bijukunjummen
- @Kukosoft
- @johngrib
- @yantantether
- @GWhiskas
- @jasdeepgill
- @markhobson
- @chenqimiao
- @stevenschlansker
- @mhewedy
- @njlaw
- @jo2
- @goribun
- @stsypanov