spring-projects/spring-framework
 Watch   
 Star   
 Fork   
19 days ago
spring-framework

v7.1.0-M2

⭐ New Features

  • Align DispatcherServlet bean detection logs #37296
  • Extract bean property path support into PropertyPath #37275
  • Expose matched PathPattern as MVC request attribute #37272
  • Add a configurable limit for maximum nesting depth in property paths #37252
  • Enforce "data: " (with space) prefix for outgoing SSE data payloads #37242
  • Parse RFC 9651-like date headers #37224
  • Polish ScheduledAnnotationBeanPostProcessor to refine null-safety #37219
  • Add batch update support to JdbcClient #37216
  • Emit multipart parts with empty bodies in PartGenerator #37202
  • Upgrade to HtmlUnit 5 #37194
  • Ignore invalid SSE retry field #37193
  • Handle MIME type parameter names case-insensitively #37192
  • Deprecate SpelParserConfiguration constructors in favor of the builder API #37190
  • When connection to client is lost while writing JSON, it should not be logged as warning #37151
  • JMS SimpleMessageConverter.fromMessage() can return null despite @NullMarked package #37148
  • Avoid unnecessary allocations for cached annotation mappings #37141
  • Update MockCookie#parse(String) validation #37136
  • Add WebFlux OpenTelemetry observation convention #37131
  • Limit bracket depth in PropertyEditorRegistrySupport's addStrippedPropertyPaths() #37020
  • Improve efficiency of map creation in DataBinder #37019
  • Reject overlapping declared and generated key columns in SimpleJdbcInsert #37014
  • Reject MIME type parameters differing only in case #37008
  • Use depth-aware bracket parsing in PropertyAccessorUtils #36999
  • Account for all array objects when checking array size in SpEL #36998
  • Align SpEL's default max auto-grow size with Spring data binding #36995
  • Avoid redundant registration of Date/Calendar/Long converters in DefaultFormattingConversionService #36951
  • Suppress CGLIB validation WARN for lifecycle callbacks #36935
  • Add Cache-Control must-understand directive #36918
  • validate samesite attribute in ResponseCookie #36905
  • Close contexts when clearing test context cache #36825
  • Use immutable map for static cache in TypeDescriptor #36813
  • Add a configurable limit for structural nesting depth in SpEL expressions #36723
  • Simplify programmatic scheduling of cron tasks with time zone #36556
  • Deprecate Derby support #36045
  • Add support for generating resources linked to a feature #35862
  • Add RFC 10008 (QUERY HTTP method) support #34993

🐞 Bug Fixes

  • PartGenerator.switchToFile() doesn't count buffered bytes toward maxDiskUsagePerPart #37238
  • Reject write methods not starting with "set" in Property #37139
  • Meta-annotations with attributes are still unnecessarily synthesized in MergedAnnotations #37135
  • Use the 4-argument Property constructor in SpEL's ReflectivePropertyAccessor #37123
  • Fix BeanFactory.getBean(String, ParameterizedTypeReference) to respect AOP proxy #37047
  • Fix OptionalToObjectConverter applicability check #36913
  • Fix Property name resolution for record-style accessors #36911

📔 Documentation

  • Fix RestClient API usage in documentation #37137
  • Add Validation section examples #36190

🔨 Dependency Upgrades

  • Upgrade to Kotlin 2.4.20 #37271
  • Upgrade to Micrometer 1.18.0-M2 and Tracing 1.8.0-M2 #37288
  • Upgrade to Reactor 2026.0.0-M2 #37263

❤️ Contributors

Thank you to all the contributors who worked on this release:

@DevJunz, @Eymenonar, @Sineaggi, @Will-thom, @blackdurumi, @cookie-meringue, @desiderantes, @dxbjavid, @froggy0m0, @gregjotau, @heka1024, @junhyeong9812, @junhyung8795, @kilink, @lArtiquel, @marschall, @mateo-maza, @ngocnhan-tran1996, @noojung, @quaff, @sabberworm, @seonwooj0810, @shaggyinsomniac, @verhasi, and @vpavic

2026-08-20 23:40:15
spring-framework

v7.0.9

⚠️ Attention Required

  • in Spring Framework 7.0.9, ForwardedHeaderFilter (Spring MVC) and ForwardedHeaderTransformer (WebFlux) each provide a boolean constructor argument whether to use the standard "Forwarded" header or the "X-Forwarded" alternative headers. A separate property turns on and off use of "X-Forwarded-Prefix". While the default constructor preserves the existing behavior, we recommend to use the new constructor to explicitly specify which forwarded headers to use to make the processing more deterministic and aligned with what is expected from the proxy. Please, see the updated Security Considerations section for details. In 7.1 with #37072 the default constructor is deprecated and marked for removal. #37090

⭐ New Features

  • Ignore an empty port value in URI parsing #37117
  • Avoid retaining class files in annotation metadata #37112
  • Add @Nullable annotations when treating Map.remove() as returning @Nullable #37067
  • Fix missing nullability in JdbcTemplate.batchUpdate #37012
  • Timeout property in RetryPolicy does not have a default constant #36983
  • Write native configuration files as UTF-8 #36972
  • DefaultServerRequest.ServletParametersMap.entrySet() does not retain HttpServletRequest.getParameterMap() order #36966
  • Perform nextKey within synchronization for SQLite as well #36959
  • Add support for custom ObjectInputFilter on DefaultDeserializer #36958
  • Revise resource bundle caching for common locales #36957
  • Improve nullability for getSession(*) in MockHttpServletRequest #36926
  • Improve fallback logic in ParameterContentNegotiationStrategy and ParameterContentTypeResolver #36925
  • Improve ambiguous match check on preflight request #36903
  • Improve Groovy markup template loading #36902
  • Improve request path handling on a Reactor Netty server #36893
  • Improve JettyWebSocketSession error handling #36891

🐞 Bug Fixes

  • EclipseLinkJpaDialect singleton lock in EclipseLinkConnectionHandle.getConnection() serializes all JDBC connection acquisitions under load #37085
  • MetadataReader fails to read byte[] array from annotation #37083
  • Character outside of permitted range in Content Disposition #37062
  • Release Jackson BufferRecycler to its pool in encoders #37059
  • Reset TwoByteMatcher partial match on mismatching byte #37053
  • Align domainToAscii with current WhatWG spec #37018
  • Ensure consistent ButtonTag value attribute processing #37017
  • SpEL's InlineList is cached as a mutable list in compiled mode #37001
  • Write native configuration file when only lambda hints are present #36989
  • SpEL Indexer reuses invalid cached PropertyAccessor #36986
  • SpEL reuses invalid cached ConstructorExecutor #36985
  • MimeTypeUtils raises StringIndexOutOfBoundsException for some invalid mime types #36971
  • Ignore DOCTYPE inside a multi-line comment body #36948
  • Avoid divide-by-zero in ExponentialBackOff jitter #36932
  • Refactor use or close lock in ConcurrentWebSocketSessionDecorator #36909
  • Host header initialization breaking change in StompRelayMessageBrokerHandler #36907
  • Remote address checks for SockJS session #36681 breaks xhr-polling #36904
  • LifeCyclePrintWriter does not delegate correctly #36885
  • IllegalArgumentException when creating named native query via Shared EntityManager with Hibernate 8.0.0-SNAPSHOT / JPA 4.0.0-M4 #36878

📔 Documentation

  • Document AOP proxy semantics for Bean Overrides in tests #37121
  • Provide guidance for object model design in SpEL #37102
  • Fix Javadoc error in ProtobufDecoder #37079
  • Document security implications of evaluating untrusted SpEL expressions #36997
  • Document relationships between expressions, evaluation contexts, and accessors in SpEL #36968
  • Update Javadoc for @ActiveProfiles ordering #36950
  • Document behavior for 0 delay combined with jitter in backoff policies #36946
  • Clarify design goal of UrlFilenameViewController in Javadoc #36906

❤️ Contributors

Thank you to all the contributors who worked on this release:

@ZaMan0806, @alexisgra, @alshain, @gianmarcoschifone, @junhyeong9812, @msridhar, @perovic, @quaff, and @samueldlightfoot

2026-08-20 23:40:15
spring-framework

v7.1.0-M1

⚠️ Attention Required

  • starting in Spring Framework 7.1, ForwardedHeaderFilter (Spring MVC) and ForwardedHeaderTransformer (WebFlux) each require a boolean argument whether to use the standard "Forwarded" header or the "X-Forwarded" alternative headers. A separate property enables use of "X-Forwarded-Prefix" if needed. The default constructor with the existing behaviour of checking both types of headers is still available but deprecated and marked for removal. The new constructor makes forwarded header processing more deterministic and aligned with what is expected from the proxy. Please, see the updated Security Considerations section, as well as related changes in Spring Boot https://github.com/spring-projects/spring-boot/issues/51030. #37072
  • Default context config is not detected when superclass or enclosing class is not annotated with @ContextConfiguration #31456

⭐ New Features

  • Add logging operators in DefaultExchangeFunction only when debug is enabled #37095
  • Consistently enforce non-null instance in AbstractFactoryBean #37091
  • Reinstate invalid resource location checks #37063
  • Preserve original bean names as aliases with FullyQualifiedConfigurationBeanNameGenerator #37038
  • Improve forwarded header parsing #36964
  • Avoid "NullAway.Init" suppression in favor of explicit field handling #36961
  • Refine and better specify error handling in MultipartParser #36947
  • Use double division to calculate applied jitter in ExponentialBackOff #36943
  • Throw ClassNotFoundException for missing class resource in ThrowawayClassLoader #36938
  • Replace isAssignableFrom() with isInstance() where feasible #36899
  • Simplify BUFFER_COUNT in ConcurrentLruCache to a constant #36872
  • Apply auto-grow collection limit to direct field binding #36862
  • Reject duplicate MIME type parameters #36841
  • Add DataSize converters to DefaultConversionService #36830
  • Only update ObservationThreadLocalAccessor when a test has an active ApplicationContext #36817
  • Deprecate setDisallowedFields in DataBinder for removal #36816
  • Optimize ClassNameReader.getClassName via direct ASM API #36814
  • AbortedException from client logged at ERROR level with WebFlux functional endpoint #36811
  • Add dedicated exception for HttpStatus.PRECONDITION_FAILED #36807
  • Reset mocks only when a test has an active ApplicationContext #36782
  • Improve MimeType parser for RFC compliance #36729
  • Reject unsafe static resource locations in MVC and WebFlux #36695
  • Use String#replace instead of String#replaceAll where appropriate #36678
  • Beans created with BeanRegistrar on GenericApplicationContext do not honor allow-bean-definition-overriding setting #36648
  • Use defensive Date copies for SimpleMailMessage sentDate #36626
  • Align StandardMethodMetadata with ASM/ClassFile support for getReturnTypeName() #36619
  • Use canonical names in error messages in annotation processing #36607
  • Provide bean conditional registration capabilities in BeanRegistrarDsl #36601
  • Align with JDK behavior by throwing TypeNotPresentException during annotation processing #36593
  • Deprecate RestTemplate and related types #36574
  • Remove deprecated methodIdentification() method in CacheAspectSupport #36560
  • Reject unbalanced parentheses in profile expressions #36550
  • Introduce ResolvableType.forParameter() factory method #36545
  • Remove redundant Assert.notNull() checks in ResolvableType #36544
  • Introduce support for custom parameter names in ParameterResolutionDelegate #36534
  • Perform case-insensitive lookup in HttpMethod.valueOf() #36518
  • Add "application/jsonl" support alongside "application/x-ndjson" for streaming #36485
  • Replace HandlerMappingIntrospector with PreFlightRequestHandler bean in MVC config #36481
  • GenericTypeResolver.resolveType should resolve TypeVariable with nested ParameterizedType #36480
  • Introduce classpath*: support for ResourceLoader#getResource with fully specified resource path #36415
  • Support for Map body types in FormHttpMessageConverter #36408
  • Support compilation of SpEL expressions that use Optional with null-safe and Elvis operators #36330
  • Skip Jaxb auto-detection in HttpMessageConverters for servers #36302
  • Handle multi-JAR resources in ReloadableResourceBundleMessageSource #36292
  • Support for JPA 4.0 @PersistenceAgent injection #36264
  • Move multipart support out of FormHttpMessageConverter #36256
  • Introduce MultipartHttpMessageConverter #36255
  • Introduce HttpMessageConverter#canWriteRepeatedly #36252
  • Override Servlet 6.1's doPatch() method in FrameworkServlet #36247
  • Allow local @BootstrapWith annotation to override a meta-annotation within the same composed annotation #35938
  • Support for JTA 2.1 read-only transaction management #35915
  • Add typesafe method to get generic bean by name with type reference #35808
  • Support reading multipart requests from RestTestClient in MockMvc #35569
  • Use 500 for default exception handling when DisconnectedClientHelper#clientDisconnectedException returns true #34481
  • Support reading multipart HTTP messages with a converter #33263
  • Provide bean conditional registration capabilities in BeanRegistrar #21497
  • Support @MockitoBean and @MockitoSpyBean on test constructor parameters #36096

🐞 Bug Fixes

  • Ignore static get/is accessor methods in PropertyDescriptorUtils #37081
  • AnnotationDescriptor.findAllLocalMergedAnnotations fails to find interface annotations #36975
  • PartGenerator should close the OutputStream when it's done reading the part #36945
  • PartGenerator should also clean up the current State in case of failure #36942
  • Close class resource InputStream in ThrowawayClassLoader #36933
  • GenericTypeResolver.resolveType picks a sibling interface's binding when two interfaces share a type-variable name (breaks @RequestBody deserialization) #36890
  • Restore thread interrupt flag in DefaultMvcResult when catching InterruptedException #36876
  • Character outside of permitted range in Content Disposition #36805
  • Reinstate Root Servlet context as a valid location #36753

🔨 Dependency Upgrades

  • Upgrade Kotlin Coroutines to 1.11 #37076
  • Upgrade to Hibernate ORM 7.4 #36519
  • Upgrade to Jackson 3.1 and 2.21 #36130
  • Upgrade to JUnit 6.1.2 #36815
  • Upgrade to Kotlin 2.3.20 #36484
  • Upgrade to Kotlin 2.4 #37074
  • Upgrade to Kotlin Serialization 1.11.0 #36657

❤️ Contributors

Thank you to all the contributors who worked on this release:

@PaulNgo-BlueOC, @arnabnandy7, @bebeis, @codingkiddo, @cookie-meringue, @daguimu, @dominik-kovacs, @jhan0121, @junhyeong9812, @leestana01, @mkurz, @ngocnhan-tran1996, @quaff, @s-chan-o, @samueldlightfoot, @seregamorph, @shenjianeng, and @yeomin4242

2026-06-09 01:20:41
spring-framework

v7.0.8

⭐ New Features

  • Include zone ID in CronTrigger's equals/hashCode implementations #36871
  • Expose ClassLoader from DefaultDeserializer #36833
  • Use immutable map for SEPARATORS static field in DefaultPathContainer #36821
  • Eagerly compute exit descriptors for negative literals #36801
  • Revise property accessor algorithms #36800
  • Improve path pattern matching #36799
  • Refine default view name resolution #36793
  • Refine Jackson JMS converters #36791
  • Improve ABNF rule checks in RfcUriParser #36787
  • Restrict SpringVersion.getVersion() to "major.minor.patch" format #36785
  • Runtime compatibility with JPA 4.0 M4 and corresponding Hibernate 8.0 snapshots #36784
  • Allow specifying the charset to use in ExchangeFilterFunctions#basicAuthentication #36777
  • Use CollectionUtils to initialize HashMap in DefaultUriBuilderFactory #36763
  • Improve error messages in SpEL #36756
  • Improve pattern caching in SpEL #36755
  • Avoid ResolvableType#forType contention for implicit cache cleanup #36745
  • Switch to JdkIdGenerator for WebSocket Sessions #36740
  • Detect custom deserialized NullValue instances in AbstractValueAdaptingCache #36727
  • LiteWebJarsResourceResolver does not resolve directories #36726
  • Warn against unsafe static resource locations in MVC and WebFlux #36692
  • Consistent compatibility with Woodstox as an alternative to Xerces #36682
  • Improve principal checks for SockJS session #36681
  • Set host header consistently in STOMP relay CONNECT frames #36673
  • Support Micrometer context propagation in Kotlin Flow #36667
  • Reliable detection of broadcast messages in UserDestinationMessageHandler #36662

🐞 Bug Fixes

  • Concurrency issue against shared cookie field in CookieLocaleResolver#setLocaleContext #36869
  • Server Sent Event does not support multi-line comments #36866
  • CronExpression skips days on midnight DST gap #36865
  • Regression in 6.2.0+: ConfigurationClassParser incorrectly removes component-scanned bean when the same class is also registered under a different name via XML #36835
  • Preserve generic type info in awaitEntity() #36834
  • Bean Background Bootstrap and Lazy Init #36844
  • Back-off for DefaultMessageListenerContainer with OracleAQ has changed and is very short in SpringBoot 4 #36809
  • Character outside of permitted range in Content Disposition #36805
  • Fix JSP tag processing #36797
  • Fix script processing capabilities #36795
  • Jaxb2XmlEncoder exclusivity prevents JacksonXmlEncoder usage and hinders POJO serialization #36776
  • JacksonXmlEncoder.canEncode incorrectly returns true for String body with application/xml #36775
  • Consistently expose map key quotes in PropertyAccessorUtils #36765
  • Fix fragment parsing for relative URI in RFC URI parser #36762
  • Fix race condition in InMemoryWebSessionStore #36742
  • Parsing failure for MIME type with quoted parameter values #36730
  • Circular dependency between supplier-created beans is silently ignored on startup #36725
  • Data is lost for joined DataBuffer in DataBufferUtils #36714
  • Cache collisions in CachingResourceResolver #36713
  • Unexpected path element removal when resolving versioned resources #36698
  • Non-deterministic "Body token not expected" in org.springframework.http.codec.multipart.PartGenerator #36694
  • Regression on value class parameter handling #36665
  • Fix inverted logic for boolean last flag in JettyWebSocketSession when sending binary message #36650
  • Parent traceId is not reused when calling WebClient.awaitExchange function #36182

📔 Documentation

  • Fix broken links to Selenium documentation #36875
  • Fix applicability note on setAutoGrowCollectionLimit #36863
  • Document @Conditional gating of nested @Configuration classes #36831
  • Javadoc of nestingLevel parameter in MethodParameter constructor is inconsistent with actual implementation #36826
  • Re-structuring of Data Binding Content in Web Sections of Documentation #36803
  • Fix typos for validateExistingTransaction #36767

🔨 Dependency Upgrades

  • Upgrade to Micrometer 1.16.6 #36883
  • Upgrade to Reactor 2025.0.6 #36884

❤️ Contributors

Thank you to all the contributors who worked on this release:

@0AndWild, @Dennis-Mircea, @cookie-meringue, @daguimu, @dmitrysulman, @kilink, @kzander91, @leestana01, @mguiking, @quaff, @seonwooj0810, @sgerke-1L, @shenjianeng, @tianhaocui, @wushiyuanmaimob, and @zmovo

2026-06-09 00:14:44
spring-framework

v6.2.19

⭐ New Features

  • Improve path pattern matching #36886
  • Eagerly compute exit descriptors for negative literals #36887
  • Expose ClassLoader from DefaultDeserializer #36839
  • Refine default view name resolution #36794
  • Refine Jackson JMS converters #36792
  • Improve ABNF rule checks in RfcUriParser #36788
  • Detect custom deserialized NullValue instances in AbstractValueAdaptingCache #36728
  • Warn against unsafe static resource locations in MVC and WebFlux #36693
  • Consistent compatibility with Woodstox as an alternative to Xerces #36683

🐞 Bug Fixes

  • Data is lost for joined DataBuffer in DataBufferUtils #36874
  • CronExpression skips days on midnight DST gap #36873
  • Concurrency issue against shared cookie field in CookieLocaleResolver#setLocaleContext #36870
  • Server Sent Event does not support multi-line comments #36867
  • Regression in 6.2.0+: ConfigurationClassParser incorrectly removes component-scanned bean when the same class is also registered under a different name via XML #36849
  • Bean Background Bootstrap and Lazy Init #36847
  • Fix JSP tag processing #36798
  • Fix script processing capabilities #36796
  • Parsing failure for MIME type with quoted parameter values #36734
  • Circular dependency between supplier-created beans is silently ignored on startup #36732
  • Non-deterministic "Body token not expected" in org.springframework.http.codec.multipart.PartGenerator #36722
  • Regression on value class parameter handling #36720
  • Cache collisions in CachingResourceResolver #36718
  • Unexpected path element removal when resolving versioned resources #36699

📔 Documentation

  • Fix broken links to Selenium documentation #36877
  • Fix applicability note on setAutoGrowCollectionLimit #36864
  • Javadoc of nestingLevel parameter in MethodParameter constructor is inconsistent with actual implementation #36848

🔨 Dependency Upgrades

  • Upgrade to JUnit 5.14.4 #36707
  • Upgrade to Micrometer 1.15.12 #36881
  • Upgrade to Reactor 2024.0.18 #36882
2026-04-17 14:32:10
spring-framework

v7.0.7

⭐ New Features

  • Improve SpringValidatorAdapter and MethodValidationAdapter performance #36621
  • Support JSON array decoding to Flux in KotlinSerializationJsonDecoder #36597
  • Deprecate methodIdentification() in CacheAspectSupport for removal #36575
  • Add MockRestServiceServer#createServer variant for RestClient #36572
  • Create RestClientXhrTransport variant replacing RestTemplateXhrTransport #36566
  • Improve error handling in multipart codecs #36563
  • Make ApplicationListenerMethodAdapter#getTargetMethod() public #36558
  • ApiVersionConfigurer.setSupportedVersionPredicate() returns void instead of ApiVersionConfigurer #36551
  • LazyConnectionDataSourceProxy does not work well with Hibernate's multi-tenancy by schema strategy #36527
  • Add registerManagedResource variant with bean key argument to MBeanExporter #36520
  • Handle blank Accept-Language header in AcceptHeaderLocaleResolver #36513
  • Make AbstractStreamingClientHttpRequest and AbstractBufferingClientHttpRequest public #36501
  • MySQL Error 149 (Galera/WSREP conflict) not translated to ConcurrencyFailureException in Spring JDBC/ORM #36499
  • Add PreFlightRequestFilter #36482
  • Support configuration of extension context scope for SpringExtension via Spring or JUnit properties #36460
  • Lower log level of "Cache miss for REQUEST dispatch" in HandlerMappingIntrospector #36309

🐞 Bug Fixes

  • WebDataBinder unnecessarily instantiates collections when using the "!" and "_" prefixes #36625
  • Cache pollution from high-cardinality FieldError default messages in MessageSourceSupport #36609
  • MergedAnnotation does not use ClassLoader for method or field #36606
  • @Sql fails if DataSource is wrapped in a TransactionAwareDataSourceProxy #36611
  • AnnotatedTypeMetadata no longer retains source declaration order on Java 24+ #36598
  • MergedAnnotation.asMap() fails when an attribute references a non-existent class #36586
  • FileSystemResource does not strictly follow the Resource#isReadable() contract #36584
  • Converter overrides in HttpMessageConverters only apply when defaults are registered #36579
  • Invalid method return type metadata for ClassFile variant on JDK 24+ #36577
  • Fix Writer lifecycle for AbstractJsonHttpMessageConverter.writeInternal(Object, Type, Writer) #36565
  • Flushing-related regression in SseServerResponse #36537
  • LazyConnectionDataSourceProxy does not pass on holdability to target Connection #36528
  • AnnotationBeanNameGenerator fails when an annotation references a non-existent class #36524
  • Perserve default API version in RestClientAdapter #36514
  • Inconsistent codings resolution in resource resolvers #36507
  • DefaultJmsListenerContainer may hang in an endless loop in doShutdown #36506
  • Query not hidden in DefaultClientResponse checkpoint #36502
  • RestClient closes stream for ResponseEntity responses #36492
  • IllegalStateException when using websocket handshake headers with Tomcat #36486
  • Invalid nullness information for ParameterizedTypeReference #36477
  • WebTestClient cannot assert null list elements #36476
  • Handle Kotlin nullable value class param correctly in CoroutineUtils #36449
  • Remove RFC 2047 encoding from Content-Disposition filename #36328
  • Parent traceId is not reused when calling WebClient.awaitExchange function #36182

📔 Documentation

  • Clarify semantics of HttpMethod.valueOf() #36652
  • Document whitespace semantics in SpEL expressions #36628
  • Document that spring.profiles.active is ignored by @ActiveProfiles #36600
  • MergedAnnotation.asAnnotationAttributes() Javadoc incorrectly states that it creates an immutable map #36567
  • Fix incorrect Javadoc in HandlerMethodReturnValueHandlerComposite regarding caching #36555
  • Fix incorrect method name in TypeDescriptor.array() Javadoc #36549
  • Introduce Kotlin examples for Bean Overrides (@MockitoBean, etc.) #36541
  • Fix incorrect cross-reference links in AbstractEnvironment Javadoc #36516
  • Document RetryTemplate#invoke variants in reference manual #36452
  • Link observability section to Micrometer Observation Handler docs #34994

🔨 Dependency Upgrades

  • Upgrade to Micrometer 1.16.5 #36659
  • Upgrade to Reactor 2025.0.5 #36658

❤️ Contributors

Thank you to all the contributors who worked on this release:

@Mohak-Nagaraju, @Sineaggi, @T45K, @angry-2k, @bebeis, @cookie-meringue, @dmitrysulman, @elgunshukurov, @itsmevichu, @junhyung8795, @msridhar, @nameearly, @tobifasc, and @xxxxxxjun

2026-04-17 14:26:24
spring-framework

v6.2.18

⭐ New Features

  • Improve SpringValidatorAdapter and MethodValidationAdapter performance #36624
  • Add missing @Deprecated(forRemoval = true) for deleted in 7.0 #36591
  • Deprecate methodIdentification() in CacheAspectSupport for removal #36576
  • Improve error handling in multipart codecs #36564
  • LazyConnectionDataSourceProxy does not work well with Hibernate's multi-tenancy by schema strategy #36529
  • MySQL Error 149 (Galera/WSREP conflict) not translated to ConcurrencyFailureException in Spring JDBC/ORM #36510

🐞 Bug Fixes

  • Handle Kotlin nullable value class param correctly in CoroutineUtils #36643
  • NullPointerException in ServerSentEvent when trying to set id or event properties #36634
  • @Sql fails if DataSource is wrapped in a TransactionAwareDataSourceProxy #36630
  • WebDataBinder unnecessarily instantiates collections when using the "!" and "_" prefixes #36627
  • Cache pollution from high-cardinality FieldError default messages in MessageSourceSupport #36623
  • ContentCachingRequestWrapper does not allow unlimited content caching #36620
  • MergedAnnotation does not use ClassLoader for method or field #36614
  • AnnotationBeanNameGenerator fails when an annotation references a non-existent class #36588
  • FileSystemResource does not strictly follow the Resource#isReadable() contract #36585
  • Query not hidden in DefaultClientResponse checkpoint #36571
  • LazyConnectionDataSourceProxy does not pass on holdability to target Connection #36530
  • DefaultJmsListenerContainer may hang in an endless loop in doShutdown #36511
  • Inconsistent codings resolution in resource resolvers #36508

📔 Documentation

  • Clarify semantics of HttpMethod.valueOf() #36653
  • Document that spring.profiles.active is ignored by @ActiveProfiles #36636
  • Document whitespace semantics in SpEL expressions #36629
  • MergedAnnotation.asAnnotationAttributes() Javadoc incorrectly states that it creates an immutable map #36568
  • Introduce Kotlin examples for Bean Overrides (@MockitoBean, etc.) #36542
  • Fix incorrect cross-reference links in AbstractEnvironment Javadoc #36517

🔨 Dependency Upgrades

  • Upgrade to Micrometer 1.15.11 #36661
  • Upgrade to Reactor 2024.0.17 #36660
2026-03-13 15:56:05
spring-framework

v7.0.6

⚠️ Attention Required

  • Log warning when default context configuration is ignored within test class hierarchies #36390
  • Ignore flush calls on ServletServerHttpResponse body outputstream #36385

⭐ New Features

  • Leverage ResourceHandlerUtils in ScriptTemplateView #36458
  • Restore ScriptTemplateViewTests #36456
  • Fix log message in ConfigurationClassBeanDefinitionReader #36453
  • DefaultResponseErrorHandler - setMessageConverters() not called via RestClient #36434
  • Resolve context initializers only once in AbstractTestContextBootstrapper #36430
  • Invoke resolveContextLoader() only once in AbstractTestContextBootstrapper #36425
  • Further align synthesized annotation toString() with modern JDKs #36417
  • Introduce setDefaultCharset() in AbstractResourceBasedMessageSource #36413
  • Support for JPA 4.0 flush mode "explicit" #36401
  • Support application-wide defaultHtmlEscape setting in WebFlux RequestContext #36400
  • Support Predicate<RequestPath>> in path API version resolver #36398
  • Avoid duplicate flushes in HttpMessageConverter implementations #36383
  • Add support for non-flushing OutputStream to StreamUtils #36382
  • Make it easier to get InputStream from RestClient #36380
  • RuntimeHintsWriter should comply with reachability-metadata-schema-v1.2.0.json #36379
  • Make it easier to create custom HttpExchangeAdapter #36374
  • Improve ResourceHttpMessageConverter target type support #36368
  • org.springframework.test.web.servlet.assertj.AbstractHttpServletResponseAssert#headers case sensitivity #36349
  • Allow registering serialized lambda metadata through RuntimeHints #36339
  • Refactor calculateHashCode in RequestMappingInfo #36325

🐞 Bug Fixes

  • MetadataReader misses enclosing class name for Kotlin nested classes with Java 24+ #36451
  • Guard against invalid id/event values in Server Sent Events #36440
  • Component scanning fails against non-loadable annotation type with enum array on Java 25 #36432
  • Duplicate ServletServerHttpRequest headers #36418
  • Incomplete debug message in ConfigurationClassBeanDefinitionReader #36410
  • Inconsistent ApplicationEventMulticaster state after removing ApplicationListener implemented by FactoryBean #36404
  • Propagate max frame length to WebSocket session #36370
  • Graceful shutdown of SimpleAsyncTaskExecutor #36362
  • Duplicate response headers with ResponseEntity<Mono<T>> (or Kotlin suspend function) controller method #36357
  • HttpServiceProxyFactory returns LinkedHashMap instead of target type for method with generic return type #36326
  • HttpMediaTypeException thrown when calculating compatible media types #36300

📔 Documentation

  • Document FullyQualifiedConfigurationBeanNameGenerator in Javadoc and reference docs #36455
  • Document @Fallback alongside Primary in the reference manual and @Bean Javadoc #36439
  • Fix links to UriComponentsBuilder and polish examples #36403
  • Emphasize @Configuration classes over XML and Groovy in testing chapter #36393
  • Document tips to avoid issues with ignored default context configuration in tests #36392
  • Polish SpEL operator examples in reference docs #36367
  • Add programmatic configuration tabs in the transactional refdoc #36323
  • Document registration recommendations for BeanPostProcessor and BeanFactoryPostProcessor #34964

🔨 Dependency Upgrades

  • Upgrade to JUnit 6.0.3 #36389
  • Upgrade to Micrometer 1.16.4 #36444
  • Upgrade to Reactor 2025.0.4 #36443

❤️ Contributors

Thank you to all the contributors who worked on this release:

@AgilAghamirzayev, @aavoronin93, @cetf9h, @froggy0m0, @gbouwen, @husseinvr97, @jisub-dev, @ngocnhan-tran1996, @siom79, and @xxxxxxjun

2026-03-13 15:43:16
spring-framework

v6.2.17

⭐ New Features

  • Leverage ResourceHandlerUtils in ScriptTemplateView #36459
  • Restore ScriptTemplateViewTests #36457
  • Fix log message in ConfigurationClassBeanDefinitionReader #36454
  • Resolve context initializers only once in AbstractTestContextBootstrapper #36431
  • Exclude legacy @javax.validation.Constraint from convention-based annotation attribute override check #36412
  • Optimize MediaType(MediaType, Charset) constructor #36351
  • Optimize the addition of a charset to the MediaType in AbstractHttpMessageConverter #36350
  • Consistent adaptation of HTTP headers on Servlet responses #36345
  • Improve performance of validation groups determination in WebFlux #36337
  • Detect all common size exceptions from Tomcat and Commons FileUpload 2.x #36324

🐞 Bug Fixes

  • Guard against invalid id/event values in Server Sent Events #36442
  • Incomplete debug message in ConfigurationClassBeanDefinitionReader #36411
  • Inconsistent ApplicationEventMulticaster state after removing ApplicationListener implemented by FactoryBean #36405
  • Graceful shutdown of SimpleAsyncTaskExecutor #36384
  • HttpMediaTypeException thrown when calculating compatible media types #36363
  • ResolvableType#getGenerics() breaks serialization #36347
  • Multipart upload leak on client abort (ByteBuf.release() not called) #36327

📔 Documentation

  • Document @Fallback alongside Primary in the reference manual and @Bean Javadoc #36441
  • Document registration recommendations for BeanPostProcessor and BeanFactoryPostProcessor #36436
  • Fix links to UriComponentsBuilder and polish examples #36406
  • Emphasize @Configuration classes over XML and Groovy in testing chapter #36394
  • Polish SpEL operator examples in reference docs #36375

🔨 Dependency Upgrades

  • Upgrade to JUnit 5.14.3 #36388
  • Upgrade to Micrometer 1.15.10 #36446
  • Upgrade to Reactor 2024.0.16 #36445
2026-02-18 20:31:03
spring-framework

v7.0.5

⚠️ Attention Required

  • Optimize request and response header handling in Spring MVC #36334

⭐ New Features

  • Consistent adaptation of HTTP headers on Servlet responses #36343
  • Copy methodAnnotations in MethodParameter copy constructor #36342
  • Improve performance of validation groups determination in WebFlux #36336
  • Reuse AnnotatedMethod annotation cache in derived instances #36322
  • Optimize the addition of a charset to the MediaType in AbstractHttpMessageConverter #36320
  • Optimize MediaType(MediaType, Charset) constructor #36318
  • Detect all common size exceptions from Tomcat and Commons FileUpload 2.x #36317
  • Consistently support @Autowired as a meta-annotation #36315
  • Avoid duplicate required attribute lookup for @Autowired annotations #36314
  • Cache @ResponseBody presence per controller class in RequestResponseBodyMethodProcessor #36311

🐞 Bug Fixes

  • ResolvableType#getGenerics() breaks serialization #36346
  • DefaultHttpMessageConverters not adding provided configurer #36332
  • Restore early MessageConsumer creation for temporary queue #36321
  • Multipart upload leak on client abort (ByteBuf.release() not called) #36262

📔 Documentation

  • Document that SpEL expressions using Optional with null-safe and Elvis operators are not compilable #36331
  • Improve documentation of baseline API version to emphasize version must be supported #36316
  • Stop referring to obsolete ListenableFuture in documentation #36313
  • Stop referring to standard Java features as "Java 8" features in documentation #36310

❤️ Contributors

Thank you to all the contributors who worked on this release:

@Niravil and @TAKETODAY