Spring v5.2.2.RELEASE Release Notes

Release Date: 2019-12-03 // over 4 years ago
  • 🍱 ⭐️ New Features

    • 0️⃣ 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
    • 0️⃣ 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
    • 0️⃣ 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

    • ⬆️ Upgrade to Reactor Dysprosium-SR2 #24037
    • ⬆️ Upgrade to Kotlin 1.3.61 #24006

    🍱 ❤️ Contributors

    🚀 We’d like to thank all the contributors who worked on our current release!