Skip to content

Releases: spring-projects/spring-framework

v5.3.7

12 May 06:08
Compare
Choose a tag to compare

⭐ New Features

  • Ensure multipart temp directories do not collide #26931
  • SpringBeanAutowiringSupport should log at warn level when autowiring fails #26925
  • spring-context-indexer doesn't support Java records #26909
  • Ignore trailing slash in CorsConfiguration origin patterns #26892
  • RSocketRequester disposal of underlying RSocketClient #26886
  • Add PreFlightRequestWebFilter #26885
  • Avoid memory leak when PropertyComparator is reused #26869
  • Support MySQL safe updates mode in MySQLMaxValueIncrementer #26858
  • HttpStatus.resolve allocates HttpStatus.values() once per invocation #26842
  • InvalidPathException in log when running SpringBootTest with NIO Path property on Windows #26828
  • Use String.startsWith() instead of String.substring() in PatternMatchUtils #26822
  • Access to the cachedSessions in CachingConnectionFactory #26811
  • Reduce log level in ExecutorConfigurationSupport.initialize #26810
  • Avoid exceptions when evaluating validation hints #26787

🪲 Bug Fixes

  • UriComponentsBuilder handles invalid port numbers correctly #26905
  • Incorrect check in AbstractBrokerRegistration's constructor #26896
  • DataClassRowMapper doesn't correctly convert generic fields #26881
  • CorsRegistration#combine is a noop #26877
  • LinkedCaseInsensitiveMap#putIfAbsent does not honor the case where the key is associated with a null value #26868
  • Provide control over fallback charset to use in WebClientResponseException #26866
  • @ModelAttribute(binding=false) is not honored with WebFlux #26856
  • Fix Kotlin filter parameter bug in Router DSLs #26838
  • AbstractListenerReadPublisher publishing onComplete signal before onNext during heavy load #26834
  • MockMvc's MVC_RESULT_ATTRIBUTE lost with HandlerMappingIntrospector and RouterFunctions in use #26833
  • webmvc.fn onError doesn't work with CompletableFuture #26831
  • Daylight saving time issue in CronExpression #26830
  • HandlerMappingIntrospector does not work with PathPattern backed HandlerMappings #26814
  • Addition of fallback patterns to DateFormatter loses cause in Spring 5.3.5 #26804
  • Support empty file uploads with HtmlUnit and MockMvc #26799
  • Cache setup failure does not provide nested cause #25250
  • Fix web parameters resolution when injected via constructor #25200

📔 Documentation

  • Document feature to load @ModelAttribute through type conversion from a request value #26873
  • Improve advice on response handling in an ExchangeFilterFunction #26819
  • Remove leftover Javadoc from WebClient #26807
  • Add information about changed behaviour for resolving @AuthenticationPrincipal annotation #26791
  • Update Javadoc on CORS in spring-websocket #26753
  • Add advice on Spring MVC path matching for 5.3 and above to the reference documentation #26750

🔨 Dependency Upgrades

  • Upgrade to Kotlin 1.5.0 #26792
  • Upgrade to Kotlin Serialization 1.2.0 #26887
  • Upgrade to Reactor 2020.0.7 #26890

❤️ Contributors

We'd like to thank all the contributors who worked on this release!

v5.2.15.RELEASE

12 May 06:31
Compare
Choose a tag to compare

⭐ New Features

  • Ensure multipart temp directories do not collide #26932
  • InvalidPathException in log when running SpringBootTest with NIO Path property on Windows #26894
  • Spring AOP should not apply UndeclaredThrowableException to checked exceptions from Kotlin methods #26839

🪲 Bug Fixes

  • Fix web parameters resolution when injected via constructor #26923
  • Fix Kotlin filter parameter bug in Router DSLs #26921
  • Incorrect check in AbstractBrokerRegistration's constructor #26898
  • @ModelAttribute(binding=false) is not honored with WebFlux #26888

📔 Documentation

  • Remove leftover Javadoc from WebClient #26809

🔨 Dependency Upgrades

  • Upgrade to Reactor Dysprosium-SR20 #26891

v5.3.6

13 Apr 11:26
Compare
Choose a tag to compare

⭐ New Features

  • Make sure file storage directory exists before usage in DefaultPartHttpMessageReader #26790
  • Allow spring-expression to be more easily repackaged for embedding in third-party JARs #26779
  • Support 'Accept-Patch' header in MVC and WebFlux #26759
  • Invalid IPv6 Address with X-Forwarded-For leads to number format exception #26748
  • awaitBodyOrNull function to handle empty body #26731
  • Reactive AbstractErrorWebExceptionHandler#htmlEscape() may be blocking #26712
  • Improve Docs on Testing Streaming Responses in Spring MVC #26687
  • Exceptions for missing request values should expose information when they are missing after conversion #26679

🪲 Bug Fixes

  • Addition of fallback patterns to temporal parser loses cause in Spring 5.3.5 #26777
  • ResourceHttpRequestHandler fails to resolve encoded paths when PathPattern is used #26775
  • Scheduling a task that runs once a day results in March 28 being skipped #26744
  • Support UTF-8 in DefaultPartHttpMessageReader #26736
  • Root path resolution for java.nio.Path properties does not work on Linux anymore #26702
  • @DirtiesContext not applied when class-level @EnabledIf evaluates to false #26694
  • MappedInterceptor in 5.3 does not support all AntPatternMatcher patterns #26690
  • BridgeMethodResolver#isBridgeMethodFor return incorrect result for kotlin code in certain circumstance #26585

📔 Documentation

  • Update ref docs regarding RequiredAnnotationBeanPostProcessor registration #26783
  • Update documentation for <context:annotation-config/> #26782
  • Fix javadoc link syntax #26776

🔨 Dependency Upgrades

  • Upgrade to Objenesis 3.2 #26714
  • Upgrade to Reactor 2020.0.6 #26767

❤️ Contributors

We'd like to thank all the contributors who worked on this release!

v5.2.14.RELEASE

13 Apr 12:09
Compare
Choose a tag to compare

⭐ New Features

  • Add missing nullable annotation to ResponseEntity ok convenience method #26614
  • Support cookies with Expires attribute but no Max-Age attribute in MockHttpServletResponse #26559

🪲 Bug Fixes

  • @DirtiesContext not applied when class-level @EnabledIf evaluates to false #26697
  • StatusAssertion value methods fail when used with custom status code #26666
  • Local @CrossOrigin maxAge value should override global value #26620
  • Correctly set auto-growing array's element #26606
  • Fix handling of "file:" paths to non-existent files on Windows #26589
  • ClassLoader.getResource can throw IllegalArgumentException #26588
  • LoadTimeWeaver no longer weaves bean classes annotated with @Component #26584
  • ResourceUrlProvider detects wrong set of handler mappings #26562

🔨 Dependency Upgrades

  • Upgrade to Reactor Dysprosium-SR19 #26768

v5.3.5

16 Mar 09:27
Compare
Choose a tag to compare

⭐ New Features

  • Expose @JmsListener endpoint id to annotation-derived listener container (for transaction definition name) #26683
  • Add support for Oracle bind marker scheme using R2DBC #26680
  • Add HTTP request cookies to the WebSocket handshake info #26674
  • Add an MockMVC alwaysDo equivalent to WebTestClient #26662
  • Ensure ClientResponse logPrefix Contains the Connection Id When Available #26656
  • Make use of Reactor Netty API for request id #26649
  • WriteResultPublisher does not pass cancel signals #26642
  • @EventListener annotated bean cannot be removed from the ApplicationEventMulticaster #26638
  • Support global @MessageExceptionHandler via @ControllerAdvice in RSocket #26636
  • Support UTF-16 and UTF-32 in Jackson HttpMessageConverters #26627
  • Add missing nullable annotation to ResponseEntity ok convenience method #26613
  • OncePerRequestFilter.isAsyncDispatch may return a NPE #26602
  • Allow AOP proxies to be created using the original ClassLoader #26601
  • WebSocketHandlerRegistration is missing option for allowedOriginPatterns #26593
  • HandlerMapping for WebSocket Requests Only #26565
  • Support cookies with Expires attribute but no Max-Age attribute in MockHttpServletResponse #26558
  • Allow logging REST endpoint mappings independent of other log categories #26539
  • Introduce 'idleReceivesPerTaskLimit' in DefaultMessageListenerContainer #26442
  • Improve handling of malformed Accept header for @ExceptionHandler methods #24539
  • Support fallback parsing patterns in @DateTimeFormat #20292

🪲 Bug Fixes

  • StatusAssertion value methods fail when used with custom status code #26658
  • Jaxb2XmlEncoder Support for Custom XML Media Types #26655
  • Local @CrossOrigin maxAge value should override global value #26619
  • Multipart boundary should strip quotes #26616
  • ServerHttpRequest content-type cannot be mutated #26615
  • Correctly set auto-growing array's element #26600
  • Change in behaviour for cron expression with day of the week range starting with SUN #26598
  • Fix handling of "file:" paths to non-existent files on Windows #26575
  • ClassLoader.getResource can throw IllegalArgumentException #26574
  • ResourceUrlProvider detects wrong set of handler mappings #26561
  • Dependency on Servlet 4.0 in spring-test makes it challenging to have Servlet 3.1 at runtime #26555
  • Response writing fails to complete with WebFlux on Tomcat #26434
  • LoadTimeWeaver no longer weaves bean classes annotated with @Component #26199

📔 Documentation

  • Fix Commons FileUpload URL in reference guide #26678
  • Update reference to deprecated CronSequenceGenerator #26651
  • Update ref docs regarding deprecated @Required annotation #26578
  • Fix build output directory for ref docs in CONTRIBUTING.md #26556
  • Document all supported SpringProperties keys in the reference manual #26554

🔨 Dependency Upgrades

  • Upgrade to Reactor 2020.0.5 #26650

❤️ Contributors

We'd like to thank all the contributors who worked on this release!

v5.3.4

16 Feb 11:19
Compare
Choose a tag to compare

⭐ New Features

  • Enforce standard Java types in YamlProcessor #26530
  • Fall back on awaitToBodylessEntity when awaitBody is used with Unit #26504
  • Expose HttpHandler Decoration as a bean #26502
  • Inefficient reflection operations for destroy method determination #26498
  • Missing CORS Headers for Static Resources in WebFlux #26495
  • Ignore null Locale in MockHttpServletResponse #26493
  • Ignore null header value in MockHttpServletResponse #26488
  • Add application/vnd.google.protobuf to ProtobufCodecSupport #26487
  • Expose ChannelId in ReactorNettyWebsocketSession #26485
  • Exclude User Destination Messages in Broker Message Handler #26474
  • UriComponentsBuilder '{' '}' may not be encoded although invalid characters #26466
  • Support BASE64 file name encoding in ContentDisposition #26463
  • Allow AbstractEnvironment subclasses to use custom ConfigurablePropertyResolver and MutablePropertySources #26462
  • Allow AbstractEnvironment to bypass active/default properties #26461
  • No way to affect response when unhandled exceptions thrown from ForwardedHeaderTransformer #26459
  • Support for servletPath prefix with PathPatternParser in Spring MVC #26445
  • Add unique number to WebFlux log prefix for Undertow server #26430
  • Provide a way to modify RequestMappingInfo conditions #26428
  • Provide better lifecyle for WebMvcConfigurer.configurePathMatch #26427
  • Fail early FactoryBean instantiation for LinkageError #26425
  • Unwrap DataSource hidden behind InfrastructureProxy in SqlScriptsTestExecutionListener #26422
  • Close mapping streams after the ValidatorFactory has been built in LocalValidatorFactoryBean #26418
  • Introduce public defineClass variant for SmartClassLoader implementations #26403
  • Return 415 for form data via @RequestBody in WebFlux #26386
  • Make set operator for MapSqlParameterSource accept nullable value #26288
  • Provide API to Expose the Handling of PreFlight Requests in WebFlux #26257
  • Configure the ObjectMappers to Use for a Class by MediaType #26212
  • Jetty 10 Support #26123
  • Introduce a NativeDetector utility class #25795
  • Add overload for MockRestServiceServer.verify with a timeout #22618

🪲 Bug Fixes

  • IllegalArgumentException due to lack of a cached lookupPath #26546
  • BeanUtils does not copy properties with generics from a Proxy since 5.3.0 #26531
  • Autowiring shortcut fails with NoSuchBeanDefinitionException after removeBeanDefinition call #26517
  • MockPart in request is not recieved in RequestPart in controller #26501
  • CORS Headers Added to Pre-Flight Request on Ambiguous Match Even Without @CrossOrigin #26490
  • SimpleJdbcInsert (sporadically) does not insert all columns #26486
  • Avoid unnecessary wrapping for SqlParameterValue #26471
  • DefaultHandlerExceptionResolver handling of media type exception on Tomcat 7+ #26470
  • Websocket extensions not working #26449
  • AbstractBeanDefinition#equals handles propertyValues incorrectly #26433
  • WebMvcConfigurationSupport.beanNameHandlerMapping does not set PathPatternParser #26414
  • Simple URL Mapping not working with PathPatternParser when Servlet context path is used #26411
  • BodyInserters.fromMultipartData swallows content type in certain cases #26410
  • MockPart is not added to parameter list anymore for Content-Type application/json #26400
  • CronExpression skips a temporal when last day of the month and * expression is used #26390
  • Malformed Content-Type Header in Response #26315

📔 Documentation

  • Update ref docs for nested class names #26540
  • RSocket support not linked from user guide index #26534
  • Document the "SpringProperties mechanism" mentioned in the testing chapter #26492
  • Document UriComponentsBuilder.pathSegment doesn't allow segments "without text" #26457
  • UriComponentsBuilder documentation error for HTTP request encoding #26453
  • Improve reference documentation on Resources #26447
  • Update documentation with details on content negotiation and the order of converter registrations #26388
  • Wrong documentation for CachePut #26186
  • Document choices for async ResponseEntity return values #22614

🔨 Dependency Upgrades

  • Update Gradle Enterprise Plugin versions #26374
  • Upgrade to JUnit 4.13.2 #26543
  • Upgrade to JUnit 5.7.1 #26510
  • Upgrade to Kotlin 1.4.30 #26545
  • Upgrade to Reactor 2020.0.4 #26548

❤️ Contributors

We'd like to thank all the contributors who worked on this release!

v5.2.13.RELEASE

16 Feb 12:15
Compare
Choose a tag to compare

⭐ New Features

  • Inefficient reflection operations for destroy method determination #26499
  • No way to affect response when unhandled exceptions thrown from ForwardedHeaderTransformer #26465
  • Fail early FactoryBean instantiation for LinkageError #26426
  • Close mapping streams after the ValidatorFactory has been built in LocalValidatorFactoryBean #26424
  • Defensively handle loadClass null result in BeanUtils.findEditorByConvention (against misbehaving ClassLoader impl such as in the GWT JettyLauncher) #26256

🪲 Bug Fixes

  • Avoid unnecessary wrapping for SqlParameterValue #26547
  • Autowiring shortcut fails with NoSuchBeanDefinitionException after removeBeanDefinition call #26518
  • SimpleJdbcInsert (sporadically) does not insert all columns #26503
  • DefaultHandlerExceptionResolver handling of media type exception on Tomcat 7+ #26475
  • Websocket extensions not working #26452
  • AbstractBeanDefinition#equals handles propertyValues incorrectly #26435
  • Remove obsolete commandName attribute in spring-form.tld #26338
  • NettyHeadersAdapter.add() accepts @Nullable value but throws NullPointerException #26277

📔 Documentation

  • Document the "SpringProperties mechanism" mentioned in the testing chapter #26494
  • UriComponentsBuilder documentation error for HTTP request encoding #26455
  • Wrong documentation for CachePut #26404

🔨 Dependency Upgrades

  • Upgrade to Reactor Dysprosium-SR17 #26549

v5.3.3

12 Jan 07:08
Compare
Choose a tag to compare

⭐ New Features

  • Add null check for ExceptionHandlerMethodResolvers #26339
  • ClassNotFoundException: ExchangeFunction when using WebTestClient with Spring MVC #26308
  • Early support for JDK 17 #26307
  • Assertion error details lost in rethrow in assertWithDiagnostics #26303
  • Update ReactiveAdapterRegistry to do classpath checks at class initialization #26295
  • Problem with @Schedule with Quartz features in CronExpression #26289
  • Make use of abortOnRequest in Jetty Reactive HttpClient #26287
  • Update OncePerRequestFilter.isAsyncDispatch to use HttpServletRequest.getDispatcherType() #26282
  • Introduce computeAttribute() in AttributeAccessor #26281
  • Translate PostgreSQL code 21000 (cardinality_violation) #26276
  • Consistent type resolution handling for NullBean #26271
  • Defensively handle loadClass null result in BeanUtils.findEditorByConvention (against misbehaving ClassLoader impl such as in the GWT JettyLauncher) #26252
  • Subscriber context not propagated to WebSocketHandler for Tomcat websockets #26210
  • Introduce ApplicationEvents abstraction to capture application events published during a test #25616
  • Spring AOP should not apply UndeclaredThrowableException to checked exceptions from Kotlin methods #23844

🪲 Bug Fixes

  • Cannot remove headers from httpHeaders.keySet() in WebFlux #26361
  • ClassCastException handling at SimpleApplicationEventMulticaster of payload items #26349
  • DefaultPartHttpMessageReader creates live resources that won't be shut down #26347
  • Sending empty Flux to RSocket channel causes DecodingException: JSON decoding error: No content to map due to end-of-input #26344
  • Fix implementation of isOpen() in ReactorNettyWebSocketSession #26341
  • Remove obsolete commandName attribute in spring-form.tld #26337
  • The response has a duplicate "Content-Length" header when get by range header #26330
  • @ExceptionHandler methods not invokable if matched on exception's cause level > 1 #26317
  • Switch to PathPatternParser for Spring MVC breaks welcome page auto configuration #26318
  • CronExpression cannot parse combination of step values #26313
  • Fix JdbcOperations.queryForObject/queryForList extensions #26312
  • ClassCastException during websocket upgrade for mutated request #26304
  • kotlinx.serialization should not be used for Java interfaces implemented by Java classes #26298
  • NettyHeadersAdapter.add() accepts @Nullable value but throws NullPointerException #26274
  • Lots of boundedElastic-evictor TIMED_WAITING threads related to form data requests #26263
  • No originalFilename in MockMultipartFile now leads to add it just as part #26261
  • UriComponentsBuilder fromUriString cannot parse File URI #26258

📔 Documentation

  • Slow prototype bean creation when migrating spring-boot 2.3.5 -> 2.4.1 #26369
  • Application built against Spring Framework 5.3 breaks deployment to Wildfly 9 #26355
  • Improve MockMvc samples in reference to show where static imports come from #26311
  • MultipartFile.getOriginalFilename() documentation should warn user not to use it as destination file name #26299
  • Spring data DomainClassConverter broken with Spring 5.3 in case of missing entity #26296
  • Document initialization and shutdown logging semantics for the TestContext framework #25385

🔨 Dependency Upgrades

  • Upgrade to Reactor 2020.0.3 #26367
  • Upgrade to Hibernate Validator 6.2 #26255

❤️ Contributors

We'd like to thank all the contributors who worked on this release!

v5.3.2

09 Dec 07:13
Compare
Choose a tag to compare

⭐ New Features

  • Refine ConfigurationClassPostProcessor behavior in native images #26236
  • Ability to correlate ByteBuf leak records to log messages for a specific request #26230
  • Avoid CGLIB proxies in websocket/messaging configuration #26227
  • ContentCachingResponseWrapper should not add “Content-Length” when “Transfer-Encoding” is present #26182
  • Allow customization of file extension to media type map for WebFlux static resources #26170
  • Register bean definition dependencies when used via configuration class injected fields #26167
  • Print helpful information in RSocket MetadataExtractor #26130
  • Add ResponseSpec#toEntityFlux overload that accepts BodyExtractor #26114
  • Wildcard is a valid Access-Control-Expose-Headers value #26113
  • Reduce overhead of char[] creation #26101
  • EntityManagerFactory startup failure in deferred mode is only available on first use #26093
  • @DynamicPropertySource is not supported via @NestedTestConfiguration semantics #26091
  • Introduce and() methods in MethodFilter and FieldFilter for composite filters #26063
  • Kotlin extensions for WebClient.ResponseSpec #26030
  • Validate that JUnit Jupiter test methods and lifecycle methods are not annotated with @Autowired #25966
  • Add support for SSE to WebMvc.fn #25920
  • Template URI Variables with newline %0A or %0D are not matched #23252

🪲 Bug Fixes

  • AsyncServerResponse interoperability issue with path variables #26239
  • Remove duplicate "property" in PropertyCacheKey.toString() #26237
  • DataBuffer Leak in Server Response #26232
  • Wrong HttpServletMapping used on INCLUDE in UrlPathHelper.skipServletPathDetermination #26216
  • MockMvc ignores MultipartFile registrations when both files and parts are registered #26166
  • cannot resolve ServerRequest::pathVariable in nested RequestPredicate #26163
  • ConcurrentModificationException in NativeMessageHeaderAccessor#copyHeaders #26155
  • AbstractServerHttpRequest constructor breaks binary compatibility between 5.2.x and 5.3.x #26151
  • Refine kotlinx.serialization support #26147
  • MimeType is no longer actually serializable #26127
  • Resttemplate throws NPE with spring-boot-starter-log4j2 within tests #26120
  • Update default for favorPathExtension to match Javadoc and as intended for 5.3 #26119
  • Spring Boot 2.4 upgrade breaks injection of Principal #26117
  • NoSuchMethodError in UrlPathHelper.skipServletPathDetermination #26112
  • Support allowedOriginPatterns in SockJS config #26108
  • PathMatchingResourcePatternResolver fails to resolve resources from JAR located in path with '#' on JDK 11+ #26104
  • @Transactional causes casting error for suspending function on Spring MVC #26092
  • UrlPathHelper#removeJsessionid doesn't remove the jsessionid from the URL #26079
  • NamedParameterJdbcTemplate.batchUpdate does not individually apply the SQL type from each SqlParameterSource argument #26071
  • Missing error status handling for toEntityFlux methods in WebClient #26069
  • DataBufferUtils#join may release a DataBuffer more than necessary #26060
  • FlightRecorderApplicationStartup exception on processing Http Request #26057
  • WebMvc.fn: ServerResponse.async does not handle exceptions as expected #25931
  • Non-compliant Content-Type header for multipart media types #25885
  • ResponseEntity Exception Handling Issues #25490

📔 Documentation

  • Clarify intended advice execution behavior in Spring version 5.2.7+ #26202
  • DateTimeFormat ISO.DATE_TIME javadoc contains misleading default note #26134
  • Spring EntityManager proxy is incompatible with Hibernate Search <5.11.6 (FullTextEntityManager instantiation fails with ClassCastException) #26090
  • Null passed in required @RequestParam now fails #26088
  • Mention security consideration in ForwardedHeaderFilter javadoc #26081
  • Add cron expression documentation #26067
  • Update javax.mail reference to jakarta.mail #25855
  • Mechanism to access request bound objects in WebClient filter in servlet env #25710
  • Document that @Transactional does not propagate to new threads #25439

🔨 Dependency Upgrades

  • Upgrade to Kotlin Coroutines 1.4.2 #26226
  • Upgrade to Reactor 2020.0.2 #26176
  • Upgrade to Kotlin 1.4.21 #26132

❤️ Contributors

We'd like to thank all the contributors who worked on this release!

v5.2.12.RELEASE

09 Dec 07:15
Compare
Choose a tag to compare

⭐ New Features

  • ContentCachingResponseWrapper should not add “Content-Length” when “Transfer-Encoding” is present #26191
  • Register bean definition dependencies when used via configuration class injected fields #26168
  • Wildcard is a valid Access-Control-Expose-Headers value #26115
  • EntityManagerFactory startup failure in deferred mode is only available on first use #26094

🪲 Bug Fixes

  • AbstractJackson2HttpMessageConverter writes partial data when exception occurs during write #26246
  • Remove duplicate "property" in PropertyCacheKey.toString() #26242
  • DataBuffer Leak in Server Response #26234
  • GenericConversionService$Converters.getMatchableConverters throws ConcurrentModificationException on Java 9+ #26184
  • ConcurrentModificationException in NativeMessageHeaderAccessor#copyHeaders #26158
  • MimeType is no longer actually serializable #26128
  • PathMatchingResourcePatternResolver fails to resolve resources from JAR located in path with '#' on JDK 11+ #26105
  • UrlPathHelper#removeJsessionid doesn't remove the jsessionid from the URL #26083
  • NamedParameterJdbcTemplate.batchUpdate does not individually apply the SQL type from each SqlParameterSource argument #26073
  • DataBufferUtils#join may release a DataBuffer more than necessary #26061

📔 Documentation

  • Clarify intended advice execution behavior in Spring version 5.2.7+ #26204
  • DateTimeFormat ISO.DATE_TIME javadoc contains misleading default note #26135
  • Document that @Transactional does not propagate to new threads #26102

🔨 Dependency Upgrades

  • Upgrade to Reactor Dysprosium-SR15 #26175