⭐ New Features
- Implement reliable invocation order for advice within an
@Aspect
#25186 - Performance enhancement in execution of ResponseEntity.of() #25183
- Support for shared GroovyClassLoader in GroovyScriptFactory #25177
- Suggest making a Set.size() > 0 judgement for AbstractApplicationContext.earlyApplicationEvents #25161
- Make use of custom types configurable in YamlProcessor #25152
- Avoid need for default constructor in ContextAnnotationAutowireCandidateResolver subclasses #25131
- ConstructorResolver.resolveConstructorArguments() return value issue #25130
- Introduce serializeToByteArray/deserializeFromByteArray convenience methods #25117
- Custom HTTP Method on MockServerHttpRequest #25109
- Missing null checks in AbstractMessageChannel.addInterceptor/setInterceptors #25088
- Avoid full synchronization in AbstractRefreshableApplicationContext.getBeanFactory() since it can lead to massive thread blocking #25081
- Simplify use of HttpContext in HttpComponentsClientHttpRequestFactory in support of user associated connections #25066
- ResolvableType forClass fails when a type in the generic signature isn't present #25064
- Include timeout unit in shutdown failure logging #25058
- Drop unnecessary intermediate StringBuilder.toString() call in ServerSentEventHttpMessageReader #25024
- Fix concurrency issues in XStreamMarshaller #25017
- Introduce mechanism to discover whether a reactive type registered in ReactiveAdapterRegistry uses deferred computation #24995
- Avoid logging exception for closed session in AbstractSockJsSession #24986
- Include response body in RestTemplate exception when there is no suitable HttpMessageConverter #24964
🪲 Bug Fixes
- ExchangeStrategies custom codec's reader & writer are not registered #25149
- MultiValueMapAdapter.getFirst fails with IndexOutOfBoundsException in case of empty List #25140
- WebSphereUowTransactionManager causes exception for PROPAGATION_SUPPORTS when timeout is specified #25132
- Avoid ClassCastException on IllegalArgumentException when invoking sync get cache method #25110
- DefaultServerRequestBuilder does not respect attributes when building the ServerRequest #25106
- Fix race condition in WriteResultPublisher between subscription and error in publishError #25096
- Jackson message converters and codecs do not respect character encoding in canRead/canWrite #25076
- DefaultClientResponseBuilder empty logPrefix when creating a DefaultClientResponse based on another #25069
- HttpHeaders equals may return false without comparing actual content #25034
- Fix race condition in WriteResultPublisher between subscription and completion in publishComplete #24989
📔 Documentation
- Javadoc for hibernate5 OpenSessionInViewFilter mentions FlushMode.NEVER #25158
- Document that the Map backing a MapPropertySource should not contain null values #25142
- Javadoc for JdbcOperations.batchUpdate should mention that negative values are possible #25138
- Fix URI pattern example in webflux.adoc #25137
- Document how reactive transactions work for cancellation in 5.2 and how it will work in 5.3 #25091
- Document whether code can rely on specific subclasses of HttpClientErrorException/HttpServerErrorException being thrown from DefaultResponseErrorHandler #25067
- Fix SpelEvaluationException with example code #25045
- javadoc: remove a comment documented a limitation on
@Lookup
annotation #25044 - Document all predefined variables from ApplicationContext available in SpEL expressions #25037
- Document ReactiveTransactionManager support in reference manual #25036
- Document ReactiveTransactionManager support #25030
- Change to placeholder value in XML is not reevaluated at runtime #25022
- Add missing
@PathVariable
declarations in examples in webmvc.adoc #25006
🔨 Dependency Upgrades
- Upgrade to Reactor Dysprosium-SR8 #25210
❤️ Contributors
We'd like to thank all the contributors who worked on this release!