Spring Boot v4.1.0-RC1 Release Notes

Release Date: 2026-04-23 // about 2 months ago
  • ⭐ New Features

    • ➕ Add support for docker.elastic.co/elasticsearch/elasticsearch #50119
    • Narrow the scope of icons pattern to /icons/icon-* #50084
    • ➕ Add configuration options for KafkaTemplate's allowNonTransactional and closeTimeout #49954
    • 0️⃣ Align ReactorHttpClientBuilder defaults with Spring Framework and provide an opt-out #49950
    • ➕ Add support for providing a custom SessionTimeout bean #49883
    • ➕ Add support for Redis Annotation driven listeners #49858
    • 👌 Support spring.webflux.default-html-escape property for application-wide HTML escaping configuration #49791
    • ➕ Add fallback support for '/opt/homebrew/bin' on macOS #49721
    • 👌 Support InetAddress filtering for HTTP Clients #49687
    • Monitor certificates from truststore in SslMeterBinder #49641
    • 🏁 Enable ansi support by default on Windows 11+ #49571
    • ➕ Add '@GrpcAdvice' exception handling support #49053
    • ➕ Add support for OpenTelemetry SDK environment variables #48799
    • ➕ Add ability to read custom layers.xml from classpath #32466
    • 👌 Support LazyConnectionDataSourceProxy #15480

    🛠 🐞 Bug Fixes

    • 🔒 Default security is misconfigured when spring-boot-actuator-autoconfigure is present and spring-boot-health is not #50190
    • 🔧 Elasticsearch Rest5Client auto-configuration misconfigures underlying HTTP client #50189
    • ApplicationPidFileWriter does not handle symlinks correctly #50186
    • RandomValuePropertySource is not suitable for secrets #50184
    • 🔧 Cassandra auto-configuration misconfigures CqlSessionBuilder #50182
    • ApplicationTemp does not handle symlinks correctly #50179
    • Remote DevTools performs comparison incorrectly #50177
    • spring.rabbitmq.ssl.verify-hostname is applied inconsistently #50175
    • 🔒 GrpcDisableCsrfHttpConfigurer incorrectly uses inverse of 'spring.grpc.server.security.csrf.enabled' property #50145
    • API versioning path strategy should be applied path last as it is not meant to yield #50127
    • 🔧 Whole number values are ignored when configuring min and max expected values and SLO boundaries for a distribution summary meter #50078
    • Classic starters are missing several modules #50072
    • ✅ Module spring-boot-resttestclient is missing from spring-boot-starter-test-classic #50070
    • Annotations like @Ssl don't work on @Bean methods when using @ServiceConnection #50065
    • 🔧 EnversRevisionRepositoriesRegistrar should reuse @EnableEnversRepositories rather than configuring the JPA counterpart #50040
    • WebFlux Cloud Foundry links endpoint includes query string from received request in resolved links #50018
    • ✅ Imports on a containing test class are ignored when a nested class has imports #50013
    • 🔒 Spring Security's PathPatternRequestMatcher.Builder is not auto-configured when using WebMvcTest and spring-boot-security-test #49988
    • 🔀 Reactive MongoDB starter has a transitive dependency on the synchronous MongoDB driver #49958
    • With spring.jackson.use-jackson2-defaults set to true, FAIL_ON_UNKNOWN_PROPERTIES is enabled #49957
    • 500 response from env endpoint when supplied pattern is invalid #49947
    • 🔧 HTTP method is lost when configuring excludes in EndpointRequest #49944
    • Honor HttpMethod for reactive additional endpoint paths #49881
    • 🐳 Docker Compose support doesn't work with apache/artemis image #49870
    • 🐳 Docker Compose support doesn't work with apache/activemq image #49867
    • ReactiveOAuth2ResourceServerAutoConfiguration should trigger only on real Reactive Applications #49807
    • ✅ Test starters 'spring-boot-starter-grpc-client-test' and 'spring-boot-starter-grpc-server-test' are missing #49690
    • 🔧 Properties in '@ConfigurationProperties' annotated type shouldn't be able to define the same '@Name' #49565
    • Distribution's SLO, minimum expected value, and maximum expected value are not applied to long task timer meters #49190
    • WebConversionService breaks embedded value resolving #8923

    📚 📔 Documentation

    • ⚡️ Update docs to encourage Java fundamentals for beginners that prefer to learn that way #50147
    • 🔧 HTTP Service Interface Clients still document that API versioning can be configured via properties #50128
    • 🔗 Link to the observability section of the Lettuce documentation is broken #50098
    • Javadoc for StaticResourceLocation.FAVICON doesn't describe icons location #50086
    • MySamlRelyingPartyConfiguration is missing a Kotlin sample #50025
    • 📚 Move OAuth2 and SAML 2.0 documentation to a security section #50022
    • 📇 Incorrect default value for management.httpexchanges.recording.include in configuration metadata #50020
    • 🔗 Link to the Kubernetes documentation when discussing startup probes #50016
    • 0️⃣ Document missing gRPC's default unit in GrpcClientProperties #49879
    • Document the need for Liquibase and Flyway starters #49875
    • Typo in JdbcSessionAutoConfiguration Javadoc #49874
    • 🔧 Clarify that configuration property default values are not available through the Environment #49852
    • 📚 Kafka documentation refers to deprecated JSON serializer and deserializer classes #49834
    • 👍 Document gRPC Support #49291

    ⬆️ 🔨 Dependency Upgrades


Previous changes from v4.1.0-M4

  • ⭐ New Features

    • ➕ Add 'spring.jpa.bootstrap' property for async background bootstrapping #49733
    • ➕ Add support for custom GrpcServerObservationConvention #49730
    • A Spring Data JPA bootstrap mode property of 'deferred' should provide a meaningful message if no suitable AsyncTaskExecutor is found #49688

    🛠 🐞 Bug Fixes

    • ✅ Test starter for Spring Integration does not include Spring Integration test module #49786
    • ✅ Some sliced tests that import TransactionAutoConfiguration do not import TransactionManagerCustomizationAutoConfiguration #49783
    • WebSocket app fails to start when Jackson is on the classpath but there's no JsonMapper bean #49755
    • 🔧 WebSocket messaging's task executors are only auto-configured and stompWebSocketHandlerMapping is only forced to be eager when using Jackson #49754
    • 📇 Metadata annotation processor ignores method-level @NestedConfigurationProperty when using constructor binding #49739
    • Override of property in external 'application.properties' or 'application.yaml' is ignored #49732
    • NativeImageResourceProvider does not find Flyway migration scripts in subdirectories #49707
    • ➕ Add @ConditionalOnWebApplication to NettyReactiveWebServerAutoConfiguration #49699
    • App using spring-cloud-stream-binder-rabbit fails to start with 4.1.0-M3 #49676
    • @GraphQlTest does not include @ControllerAdvice #49673

    📚 📔 Documentation

    • 🛠 Fix incorrect indefinite articles in Javadoc #49728
    • 🔧 Document gRPC's default unit in configuration properties consistently #49722
    • ➕ Add some more Kotlin examples and trivial style fixes #49715
    • 📚 Overhaul Spring Session documentation following modularization #49705

    ⬆️ 🔨 Dependency Upgrades

    • ⬆️ Upgrade to Artemis 2.53.0 #49769
    • ⬆️ Upgrade to Brave 6.3.1 #49771
    • ⬆️ Upgrade to Grpc Java 1.80.0 #49772
    • ⬆️ Upgrade to Jackson 2 Bom 2.21.2 #49773
    • ⬆️ Upgrade to jOOQ 3.21.0 #49774
    • ⬆️ Upgrade to Netty 4.2.12.Final #49795
    • ⬆️ Upgrade to Prometheus Client 1.5.1 #49777
    • ⬆️ Upgrade to Protobuf Common Protos 2.67.0 #49778
    • ⬆️ Upgrade to Protobuf Java 4.34.1 #49779
    • ⬆️ Upgrade to Protobuf Maven Plugin 5.1.0 #49776
    • ⬆️ Upgrade to Thymeleaf Layout Dialect 4.0.1 #49780
    • ⬆️ Upgrade to Tomcat 11.0.20 #49781
    • ⬆️ Upgrade to Zipkin Reporter 3.5.3 #49770

    ❤️ Contributors

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

    @deejay1, @dlwldnjs1009, @kwondh5217, @ljrmorgan, @quaff, and @therepanic