Spring Framework

Overview

Spring Framework Build Status Revved up by Gradle Enterprise

This is the home of the Spring Framework: the foundation for all Spring projects. Collectively the Spring Framework and the family of Spring projects are often referred to simply as "Spring".

Spring provides everything required beyond the Java programming language for creating enterprise applications for a wide range of scenarios and architectures. Please read the Overview section as reference for a more complete introduction.

Code of Conduct

This project is governed by the Spring Code of Conduct. By participating, you are expected to uphold this code of conduct. Please report unacceptable behavior to [email protected].

Access to Binaries

For access to artifacts or a distribution zip, see the Spring Framework Artifacts wiki page.

Documentation

The Spring Framework maintains reference documentation (published and source), Github wiki pages, and an API reference. There are also guides and tutorials across Spring projects.

Micro-Benchmarks

See the Micro-Benchmarks Wiki page.

Build from Source

See the Build from Source Wiki page and the CONTRIBUTING.md file.

Continuous Integration Builds

Information regarding CI builds can be found in the Spring Framework Concourse pipeline documentation.

Stay in Touch

Follow @SpringCentral, @SpringFramework, and its team members on Twitter. In-depth articles can be found at The Spring Blog, and releases are announced via our news feed.

License

The Spring Framework is released under version 2.0 of the Apache License.

Comments
  • Maven 2 support (POMs) [SPR-1484]

    Maven 2 support (POMs) [SPR-1484]

    Aleksander Blomskøld opened SPR-1484 and commented

    Maven 2 POMs with dependencies is missing for Spring. It's a lot of extra job for maven 2 users to find out which dependencies Spring needs, and to have to include them manually.


    Attachments:

    Issue Links:

    • #6209 maven pom hosed on repo1.maven.org ("is duplicated by")
    • #6533 Missing m2 POMs at ibiblio.net ("is duplicated by")

    121 votes, 60 watchers

    type: enhancement has: votes-jira 
    opened by spring-projects-issues 75
  • Add support for iBatis 3 [SPR-5991]

    Add support for iBatis 3 [SPR-5991]

    Gabriel Axel opened SPR-5991 and commented

    iBatis 3 beta 1 introduced API changes which break the existing Spring support.


    Affects: 3.0 M3

    Attachments:

    Issue Links:

    • #10803 Add support for iBatis 3 ("is duplicated by")
    • DATAJDBC-2 Add support for MyBatis 3

    50 votes, 55 watchers

    in: data status: declined type: enhancement has: votes-jira 
    opened by spring-projects-issues 73
  • Response writing fails to complete with WebFlux on Tomcat

    Response writing fails to complete with WebFlux on Tomcat

    Affects: \v5.3.3

    The symptom of this issue is similar to previous issue https://github.com/spring-projects/spring-framework/issues/23096 (response handling never completes) though the underlying cause is different.

    I've reproduced this issue with the small demo spring-boot project which uses WebFlux on Tomcat, seen here: https://github.com/danielra/webflux_race_investigation The project can be built with ./gradlew clean build and then run via ./start.sh. To reproduce the problem I've been successful using wrk (https://github.com/wg/wrk) to throw some load at the service, stop and then throw some more etc.. For example:

    for i in {1..100}; do   ./wrk -t 2 -c 1000 -d 10s --latency --timeout 9s --script ./myPost.lua http://localhost:8080/post; done
    

    Where ./myPost.lua looks like:

    wrk.method = "POST"
    wrk.body   = "[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]"
    wrk.headers["Content-Type"] = "application/json"
    

    (I don't think this being a POST request really ended up being relevant, but I started here because I was trying to start the more isolated repro somewhere somewhat similar to the real system that was experiencing the problem.)

    This will result in a lot of trace level logging under a logs directory in the demo project. This can be searched through to find any occurrences like:

    find . -name \*.gz -print0 | xargs -0 zgrep "Response timeout"
    

    And then another search for the logPrefix found in resulting log entries can be performed to gain more context on the processing for the relevant request.

    This is an example set of log entries for a repro case (with irrelevant line prefixes ommitted):

    12:31:47,007 INFO c.e.d.f.DemoWebFilter [http-nio-8080-exec-368] [33d6780] Incoming request observed.
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] UNSUBSCRIBED -> SUBSCRIBING
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] 9223372036854775807 requested
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] SUBSCRIBING -> DEMAND
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] onDataAvailable
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] DEMAND -> READING
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] Read 8092 bytes
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] Publishing data read
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] Read 8192 bytes
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] Publishing data read
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] Read 4067 bytes
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] Publishing data read
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] No more data to read
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] READING -> DEMAND
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] onAllDataRead
    12:31:47,007 TRACE _.s.h.s.r.AbstractListenerReadPublisher [http-nio-8080-exec-368] [33d6780] DEMAND -> COMPLETED
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteFlushProcessor [parallel-2] [33d6780] UNSUBSCRIBED -> REQUESTED
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteFlushProcessor [parallel-2] [33d6780] Received onNext publisher
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteFlushProcessor [parallel-2] [33d6780] REQUESTED -> RECEIVED
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] UNSUBSCRIBED -> REQUESTED
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] Item to write
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] REQUESTED -> RECEIVED
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] onWritePossible
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] RECEIVED -> WRITING
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] Wrote 12931 of 12931 bytes
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] WRITING -> REQUESTED
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] No more items to write
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] REQUESTED -> RECEIVED
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [parallel-2] [33d6780] isWritePossible: false
    12:31:47,780 TRACE _.s.h.s.r.WriteResultPublisher [parallel-2] [33d6780] UNSUBSCRIBED subscribe: org.springframework.http.server.reactive.AbstractListenerWriteFlushProcessor$State$WriteResultSubscriber@7a996bbf
    12:31:47,780 TRACE _.s.h.s.r.WriteResultPublisher [parallel-2] [33d6780] SUBSCRIBING request: 9223372036854775807
    12:31:47,780 TRACE _.s.h.s.r.AbstractListenerWriteFlushProcessor [parallel-2] [33d6780] Received onComplete
    12:31:47,780 TRACE _.s.h.s.r.WriteResultPublisher [parallel-2] [33d6780] UNSUBSCRIBED subscribe: reactor.core.publisher.MonoNext$NextSubscriber@53a4d00d
    12:31:47,780 TRACE _.s.h.s.r.WriteResultPublisher [parallel-2] [33d6780] SUBSCRIBING request: 9223372036854775807
    12:31:47,781 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [http-nio-8080-exec-348] [33d6780] onWritePossible
    12:31:47,781 TRACE _.s.h.s.r.AbstractListenerWriteProcessor [http-nio-8080-exec-348] [33d6780] RECEIVED -> COMPLETED
    12:31:47,781 TRACE _.s.h.s.r.WriteResultPublisher [http-nio-8080-exec-348] [33d6780] SUBSCRIBED publishComplete
    12:31:47,781 TRACE _.s.h.s.r.AbstractListenerWriteFlushProcessor [http-nio-8080-exec-348] [33d6780] RECEIVED writeComplete
    12:31:47,781 TRACE _.s.h.s.r.AbstractListenerWriteFlushProcessor [http-nio-8080-exec-348] [33d6780] Flush attempt
    12:31:47,781 TRACE _.s.h.s.r.AbstractListenerWriteFlushProcessor [http-nio-8080-exec-348] [33d6780] RECEIVED flushingFailed
    12:31:59,588 TRACE _.s.h.s.r.AbstractListenerReadPublisher [parallel-4] [33d6780] Cancellation
    12:31:59,588 TRACE _.s.h.s.r.WriteResultPublisher [parallel-4] [33d6780] SUBSCRIBED cancel
    12:31:59,588 ERROR c.e.d.f.DemoWebFilter [parallel-4] [33d6780] Response timeout after 12581 milliseconds for null request with uri 'http://localhost:8080/post'. Response status code was already committed: '200 OK'.                                                                                                                                                                                                               12:31:59,588 TRACE o.s.h.s.r.ServletHttpHandlerAdapter [parallel-4] [33d6780] Handling completed
    

    Here the line 12:31:47,781 TRACE _.s.h.s.r.AbstractListenerWriteFlushProcessor [http-nio-8080-exec-348] [33d6780] RECEIVED flushingFailed comes from a modification I made locally to the spring-framework to add an additional trace log line here: https://github.com/spring-projects/spring-framework/blob/v5.3.3/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteFlushProcessor.java#L194-L195 like so:

    if (rsWriteFlushLogger.isTraceEnabled()) {
                rsWriteFlushLogger.trace(this.logPrefix + this.state + " flushingFailed", t);
    }
    

    For reference, the relevant Throwable logged at these lines in these reproductions with this demo project looks like:

    org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
            at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:272) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:118) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.springframework.http.server.reactive.ServletServerHttpResponse.flush(ServletServerHttpResponse.java:198) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.ServletServerHttpResponse.access$500(ServletServerHttpResponse.java:50) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.ServletServerHttpResponse$ResponseBodyFlushProcessor.flush(ServletServerHttpResponse.java:316) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.AbstractListenerWriteFlushProcessor$State$3.writeComplete(AbstractListenerWriteFlushProcessor.java:291) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.AbstractListenerWriteFlushProcessor$State$WriteResultSubscriber.onComplete(AbstractListenerWriteFlushProcessor.java:437) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.WriteResultPublisher$State.publishComplete(WriteResultPublisher.java:256) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.WriteResultPublisher.publishComplete(WriteResultPublisher.java:84) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.AbstractListenerWriteProcessor.changeStateToComplete(AbstractListenerWriteProcessor.java:280) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.AbstractListenerWriteProcessor.access$300(AbstractListenerWriteProcessor.java:46) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.AbstractListenerWriteProcessor$State$3.onWritePossible(AbstractListenerWriteProcessor.java:368) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.AbstractListenerWriteProcessor.onWritePossible(AbstractListenerWriteProcessor.java:153) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.springframework.http.server.reactive.ServletServerHttpResponse$ResponseBodyWriteListener.onWritePossible(ServletServerHttpResponse.java:270) ~[spring-web-5.3.3.jar!/:5.3.3]
            at org.apache.coyote.Response.onWritePossible(Response.java:762) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:188) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:241) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_282]
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_282]
            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at java.lang.Thread.run(Thread.java:748) [?:1.8.0_282]
    Caused by: java.io.IOException: Broken pipe
            at sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[?:1.8.0_282]
            at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[?:1.8.0_282]
            at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[?:1.8.0_282]
            at sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[?:1.8.0_282]
            at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:470) ~[?:1.8.0_282]
            at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1269) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:764) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.tomcat.util.net.SocketWrapperBase.flushNonBlocking(SocketWrapperBase.java:735) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:709) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.flush(Http11OutputBuffer.java:572) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.coyote.http11.filters.IdentityOutputFilter.flush(IdentityOutputFilter.java:117) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.coyote.http11.Http11OutputBuffer.flush(Http11OutputBuffer.java:220) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.coyote.http11.Http11Processor.flush(Http11Processor.java:1195) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:402) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.coyote.Response.action(Response.java:209) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:305) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
            ... 25 more
    

    And appears to me to be a result of the client hanging up the connection before response handling is complete on the server.

    After this flushingFailed log line, we can see a relatively large (~12 second) gap in time before the next log line which was triggered by the response timeout being triggered which is setup in the DemoWebFilter in the demo project here: https://github.com/danielra/webflux_race_investigation/blob/main/src/main/java/com/example/demo/filter/DemoWebFilter.java#L38 And only after this timeout does ServletHttpHandlerAdapter log a line indicating that handling is complete.

    I note that the flushingFailed method where I added the extra log line above has a comment which reads:

    Invoked when an error happens while flushing. Sub-classes may choose to ignore this if they know the underlying API will provide an error notification in a container thread. Defaults to no-op.

    Based on this description and the observed behavior, it seems to me that perhaps a notification of the error was expected elsewhere, but it was never actually received so handling of the response is never completed (without a timeout present). I don't know enough yet to say whether that was due to a bug in the code that should have emitted the error notification or on the listening side - or if there should actually be a real non-no-op operation implemented of flushingFailed in the relevant subclass in the Tomcat case. However, my expectation is that regardless of when a client hangs up the connection the server should proceed with completing response handling.

    Please let me know if any additional information would be helpful. Thank you for your time!


    in: web type: bug 
    opened by danielra 69
  • Sonatype vulnerability CVE-2016-1000027 in Spring-web project

    Sonatype vulnerability CVE-2016-1000027 in Spring-web project

    Affects: \5.2.3.RELEASE

    Issue Title : Sonartype vulnerability CVE-2016-1000027 in Spring-web project

    Description Description from CVE Pivotal Spring Framework 4.1.4 suffers from a potential remote code execution (RCE) issue if used for Java deserialization of untrusted data. Depending on how the library is implemented within a product, this issue may or not occur, and authentication may be required. Explanation The org.springframework:spring-web package is vulnerable to deserialization of untrusted data leading to Remote Code Execution (RCE). The readRemoteInvocation method in HttpInvokerServiceExporter.class does not properly verify or restrict untrusted objects prior to deserializing them. An attacker can exploit this vulnerability by sending malicious requests containing crafted objects, which when deserialized, execute arbitrary code on the vulnerable system.

    NOTE: This vulnerability is related to a previously reported deserialization vulnerability (CVE-2011-2894) within the package, impacting a different class.

    Detection The application is vulnerable by using this component under specific scenarios as listed out in the advisory.

    Reference: https://www.tenable.com/security/research/tra-2016-20

    Recommendation There is no non-vulnerable upgrade path for this component/package. We recommend investigating alternative components or a potential mitigating control.

    A warning has been provided in the official Javadocs of the HttpInvokerServiceExporter class:

    "WARNING: Be aware of vulnerabilities due to unsafe Java deserialization: Manipulated input streams could lead to unwanted code execution on the server during the deserialization step. As a consequence, do not expose HTTP invoker endpoints to untrusted clients but rather just between your own services. In general, we strongly recommend any other message format (e.g. JSON) instead."

    The developer's general advice also states: "Do not use Java serialization for external endpoints, in particular not for unauthorized ones. HTTP invoker is not a well-kept secret (or an "oversight") but rather the typical case of how a Spring application would expose serialization endpoints to begin with... he has a point that we should make this case all across our documentation, including the javadoc. But I don't really see a CVE case here, just a documentation improvement.

    Pivoltal will enhance their documentation for the 4.2.6 and 3.2.17 releases."

    Reference: https://www.tenable.com/security/research/tra-2016-20

    Root Cause spring-web-5.2.3.RELEASE.jar <= org/springframework/remoting/httpinvoker/HttpInvokerServiceExporter.class : [2.5.1,) Advisories Third Party: https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2016-1000027 Third Party: https://www.tenable.com/security/research/tra-2016-20 CVSS Details CVE CVSS 3: 9.8 CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

    status: invalid 
    opened by gauravdeshmukh612 66
  • Spring component scanning does not work within JBoss EJB container [SPR-5120]

    Spring component scanning does not work within JBoss EJB container [SPR-5120]

    Pedro Santos opened SPR-5120 and commented

    The spring scanner functionality do not work when I create my ApplicationContext from a EJB managed by JBoss. I do test the same spring application context on diferents enviroments. Just on a managed EJB on a JBoos it is not workin.

    EJB code appContext = new GenericApplicationContext(); ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(appContext); scanner.scan("com"); appContext.refresh();

    Annotated class @Service public class TransactionService {

    Exception ERROR: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionService' is defined


    Affects: 2.5.5

    Attachments:

    Issue Links:

    • #10814 JBoss AS 5.0 VFS handling (SPR-5120) backport 2.5.X ("is depended on by")
    • #11051 Context Scanning doesnt work in Jboss 5 ("is duplicated by")
    • #10013 PathMatchingResourcePatternResolver.determineRootDir fails for jar on JBoss
    • #10454 PersistenceUnitReader#determinePersistenceUnitRootUrl returns wrong root url on JBoss 5, causing no detection of entity beans

    Referenced from: commits https://github.com/spring-projects/spring-framework/commit/184f63f68951ed1c199dddc27a6a266f09e9e0ce, https://github.com/spring-projects/spring-framework/commit/10c30f0315b41cd3168a7d6c8b984a12f49c62b1, https://github.com/spring-projects/spring-framework/commit/64c46d48bb916bc52ff2f38b4f5d4a9ffb5b794c

    24 votes, 34 watchers

    type: enhancement has: votes-jira 
    opened by spring-projects-issues 48
  • on JDK 11 - WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (file:/C:/Users/.../spring-core/4.3.22.RELEASE/spring-core-4.3.22.RELEASE.jar)

    on JDK 11 - WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (file:/C:/Users/.../spring-core/4.3.22.RELEASE/spring-core-4.3.22.RELEASE.jar)

    Error for Spring Boot 1.5.x (1.5.19.RELEASE, using the latest spring-core-4.3.22.RELEASE.jar)

    I have not seen this error before within previous boot 1.5.17.RELEASE.
    And frankly upgrade to the latest 1.5.19.RELEASE/spring-core-4.3.22.RELEASE.jar was maybe 1-2 weeks ago.

    So why this error appeared?

    14:43:23.388 [main] INFO  o.s.b.f.s.DefaultListableBeanFactory#registerBeanDefinition:826 - Overriding bean definition for bean 'managementServletContext' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.actuate.autoconfigure.EndpointWebMvcHypermediaManagementContextConfiguration; factoryMethodName=managementServletContext; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/actuate/autoconfigure/EndpointWebMvcHypermediaManagementContextConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration; factoryMethodName=managementServletContext; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.class]]
    WARNING: An illegal reflective access operation has occurred
    WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (file:/C:/Users/myuserlogin/.m2/repository/org/springframework/spring-core/4.3.22.RELEASE/spring-core-4.3.22.RELEASE.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
    WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1
    WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
    WARNING: All illegal access operations will be denied in a future release
    14:43:25.687 [main] INFO  o.s.b.f.a.AutowiredAnnotationBeanPostProcessor#<init>:155 - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
    

    image

    ref https://github.com/spring-projects/spring-framework/issues/22019

    in: core 
    opened by paulvi 47
  • Add Kotlin DSL for working with MockMvc

    Add Kotlin DSL for working with MockMvc

    This DSL make working with MockMvc much cleaner.

    Example:

    	@Test
    	fun json() {
    		mockMvc.performGet("/person/{name}", "Lee") {    // 1
    			builder { accept(MediaType.APPLICATION_JSON) } // 2
    			printRequestAndResponse() // 3
    			expect { // 4
    				status { isOk }
    				content { contentType("application/json;charset=UTF-8") }
    				jsonPath("$.name") { value("Lee") }
    				json("""{"someBoolean": false}""", strict = false)
    			}
    		}
    	}
    

    Highlights:

    1. Extension methods to mockMvc to start dsl
    2. Builder block for configuring request
    3. Useful equivalent to andDo(print()) that avoids static imports
    4. Expect block that highlights response expectations

    This code is based on the work of @petrbalat and myself in https://github.com/petrbalat/kd4smt

    in: test in: web type: enhancement 
    opened by checketts 46
  • InMemoryWebSessionStore indirectly causing infinite loop inside tomcat-native OpenSSL under load

    InMemoryWebSessionStore indirectly causing infinite loop inside tomcat-native OpenSSL under load

    This is a fun one....

    When load testing a new app using...

    • Spring Boot 2.4.2
    • WebFlux 5.3.3
    • Spring Security 5.4.2
    • Tomcat 9.0.41
    • tomcat-native 1.2.25
    • APR 1.6.5
    • OpenSSL 1.1.1f

    ...CPU utilization will max out, and stay maxed out even after the load test completes.

    When investigating, I found that threads in the global boundedElastic Scheduler are consuming the entire CPU, as seen in top (broken out by threads)...

    top - 17:56:42 up 12 min,  0 users,  load average: 0.61, 0.24, 0.15
    Threads: 112 total,   3 running, 109 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 53.8 us,  0.3 sy,  0.0 ni, 45.7 id,  0.0 wa,  0.0 hi,  0.1 si,  0.1 st
    MiB Mem :  11852.9 total,   8478.8 free,   1267.9 used,   2106.2 buff/cache
    MiB Swap:      0.0 total,      0.0 free,      0.0 used.  10278.6 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      212 bogus     20   0 6635460 493008  18064 R  99.9   4.1   0:07.44 boundedElastic-  <--- CPU maxed out
      170 bogus     20   0 6635460 493008  18064 R  99.7   4.1   0:21.02 boundedElastic-  <--- CPU maxed out
       17 bogus     20   0 6635460 493008  18064 S   9.6   4.1   0:26.19 C2 CompilerThre
      235 bogus     20   0 6635460 493008  18064 S   1.3   4.1   0:00.13 boundedElastic-
       18 bogus     20   0 6635460 493008  18064 S   0.7   4.1   0:04.61 C1 CompilerThre
      234 bogus     20   0 6635460 493008  18064 S   0.7   4.1   0:00.79 boundedElastic-
       85 bogus     20   0    9416   2340   1468 R   0.7   0.0   0:00.43 top
       36 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:00.39 https-openssl-n
       47 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:01.70 https-openssl-n
      166 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:00.77 parallel-4
      167 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:00.15 https-openssl-n
      175 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:00.11 https-openssl-n
      179 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:00.09 https-openssl-n
      184 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:00.11 https-openssl-n
      192 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:00.09 https-openssl-n
      204 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:00.09 https-openssl-n
      210 bogus     20   0 6635460 493008  18064 S   0.3   4.1   0:00.10 https-openssl-n
    ...
    

    Taking a stackdump of the process reveals the two threads are inside tomcat's OpenSSLEngine... (note that nid=0xd4 correlates to PID 212 above)

    "boundedElastic-8" #86 daemon prio=5 os_prio=0 cpu=128128.31ms elapsed=215.53s allocated=28746K defined_classes=1 tid=0x00007fee00035800 nid=0xd4 runnable  [0x00007fed91cbe000]
       java.lang.Thread.State: RUNNABLE
    	at org.apache.tomcat.util.net.openssl.OpenSSLEngine.unwrap(OpenSSLEngine.java:603)
    	- locked <0x00000007576d7df8> (a org.apache.tomcat.util.net.openssl.OpenSSLEngine)
    	at javax.net.ssl.SSLEngine.unwrap([email protected]/SSLEngine.java:637)
    	at org.apache.tomcat.util.net.SecureNioChannel.read(SecureNioChannel.java:617)
    	at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1229)
    	at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1141)
    	at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:795)
    	at org.apache.coyote.http11.Http11InputBuffer.available(Http11InputBuffer.java:675)
    	at org.apache.coyote.http11.Http11Processor.available(Http11Processor.java:1201)
    	at org.apache.coyote.AbstractProcessor.isReadyForRead(AbstractProcessor.java:838)
    	at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:577)
    	at org.apache.coyote.Request.action(Request.java:432)
    	at org.apache.catalina.connector.InputBuffer.isReady(InputBuffer.java:305)
    	at org.apache.catalina.connector.CoyoteInputStream.isReady(CoyoteInputStream.java:201)
    	at org.springframework.http.server.reactive.ServletServerHttpRequest$RequestBodyPublisher.checkOnDataAvailable(ServletServerHttpRequest.java:295)
    	at org.springframework.http.server.reactive.AbstractListenerReadPublisher.changeToDemandState(AbstractListenerReadPublisher.java:222)
    	at org.springframework.http.server.reactive.AbstractListenerReadPublisher.access$1000(AbstractListenerReadPublisher.java:48)
    	at org.springframework.http.server.reactive.AbstractListenerReadPublisher$State$2.request(AbstractListenerReadPublisher.java:333)
    	at org.springframework.http.server.reactive.AbstractListenerReadPublisher$ReadSubscription.request(AbstractListenerReadPublisher.java:260)
    	...
    

    In a debug session, I discovered that an infinite loop is executing in tomcat's OpenSSLEngine.unwrap where:

    • pendingApp = 2
    • idx = 1
    • endOffset = 1
    • capacity = 16384

    I would have expected the OpenSSL I/O code to execute on one of the https-openssl-nio-* threads, not the boundedElastic Scheduler. Therefore, I started investigating why this code was executing on the boundedElastic Scheduler.

    After more debugging I narrowed it down to InMemoryWebSessionStore.createWebSession(). This is the only location in this particular app that uses the boundedElastic Scheduler.

    The WebSession is being created because Spring Security's WebSessionServerRequestCache is being used, which persists requests in the WebSession.

    If I disable the request cache (which removes the usage of WebSession, which removes the call to InMemoryWebSessionStore.createWebSession(), which removes usage of boundedElastic), then all I/O is performed on the https-openssl-nio-* threads, and the infinite loop does not occur.

    I haven't fully investigated why the infinite loop occurs, but I assume there is a threadsafety bug somewhere in tomcat's OpenSSLEngine. (Either that or it was never intended to be used from multiple threads.) Having said that, I don't think that the I/O should be occurring on the boundedElastic thread, so I did not investigate further.

    In other words, in my opinion, using InMemoryWebSessionStore should not cause the OpenSSL I/O to occur on a boundedElastic thread.

    I have attached a simple application that can be used to reproduce the problem. After extracting, use docker-compose up to build and start a container with the spring boot app with the above configuration. Sending a lot of load (>= 2000 calls per second) to the /echo endpoint will reproduce the infinite loop. However, you can see OpenSSL I/O occurring on the boundedElastic threads with any amount of load.

    status: superseded 
    opened by philsttr 45
  • SimpMessagingTemplate.convertAndSend causes hanging thread

    SimpMessagingTemplate.convertAndSend causes hanging thread

    Affects: 5.3.3.RELEASE

    I'm using spring boot 2.4.2 with RabbitMQ as message broker and spring-boot-starter-jetty. I got an issue on my production server with a jetty thread hangs so long time(almost 2 days) with the thread dump information as below

    "qtp682812632-42" Id=0x2a WAITING on java.util.concurrent.CompletableFuture$Signaller@1601acdf
              at [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
              -  waiting on java.util.concurrent.CompletableFuture$Signaller@1601acdf
              at [email protected]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
              at [email protected]/java.util.concurrent.CompletableFuture$Signaller.block(CompletableFuture.java:1796)
              at [email protected]/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3128)
              at [email protected]/java.util.concurrent.CompletableFuture.waitingGet(CompletableFuture.java:1823)
              at [email protected]/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1998)
              at org.springframework.util.concurrent.CompletableToListenableFutureAdapter.get(CompletableToListenableFutureAdapter.java:99)
              at org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler$SystemSessionConnectionHandler.forward(StompBrokerRelayMessageHandler.java:1081)
              at org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler.handleMessageInternal(StompBrokerRelayMessageHandler.java:599)
              at org.springframework.messaging.simp.broker.AbstractBrokerMessageHandler.handleMessage(AbstractBrokerMessageHandler.java:262)
              at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:144)
              at org.springframework.messaging.support.ExecutorSubscribableChannel.sendInternal(ExecutorSubscribableChannel.java:100)
              at org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:139)
              at org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:125)
              at org.springframework.messaging.simp.SimpMessagingTemplate.sendInternal(SimpMessagingTemplate.java:187)
              at org.springframework.messaging.simp.SimpMessagingTemplate.doSend(SimpMessagingTemplate.java:162)
              at org.springframework.messaging.simp.SimpMessagingTemplate.doSend(SimpMessagingTemplate.java:48)
              at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
              at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:151)
              at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:129)
              at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:122)
    

    For sending messages, I just using this code:

    response.getMessageList().forEach(m -> messageTemplate.convertAndSend(m.getTopicUrl(), m.getMessageData()));
    response.setMessageList(null); //Remove message list
    return response;
    

    Any help would be appreciated.

    in: messaging for: external-project 
    opened by hurahurat 44
  • Illegal reflective access operation on Java 11 for lazy-init beans registered with MBeanServer

    Illegal reflective access operation on Java 11 for lazy-init beans registered with MBeanServer

    I'm using spring-boot 2.2.0.M2 with Java 11 and i am getting this warning:

    WARNING: An illegal reflective access operation has occurred
    WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils (file:/home/porfirio/.m2/repository/org/springframework/spring-core/5.2.0.M1/spring-core-5.2.0.M1.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
    WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils
    WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
    WARNING: All illegal access operations will be denied in a future release
    

    I don't know if it is a know bug with spring-boot+java11 or an issue on my end

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    in: core status: feedback-provided 
    opened by porfirioribeiro 44
  • Provide @Rule alternative to SpringJUnit4ClassRunner [SPR-7731]

    Provide @Rule alternative to SpringJUnit4ClassRunner [SPR-7731]

    Dave Syer opened SPR-7731 and commented

    Overview

    Sometimes (always?) it would be nice to have a @Rule implementation that did the job of the SpringJUnit4ClassRunner.

    The main motivation for this is to be able to use other runners (e.g. @Parameterized, @Categories, Mockito, etc.).

    There might even be a case for deprecating the runner in favor of a @Rule?


    Further Resources

    • https://github.com/junit-team/junit/issues/200
    • https://github.com/junit-team/junit/issues/444
    • https://github.com/junit-team/junit/issues/766
    • https://github.com/spring-projects/spring-framework/pull/222
    • https://github.com/mmichaelis/spring-aware-rule

    Attachments:

    Issue Links:

    • #11259 Introduce a TestExecutionListener for DbUnit ("Cloned from")
    • #17629 Document SpringClassRule and SpringMethodRule in the reference manual ("is depended on by")
    • #13870 JUnit @Rule executes outside of transaction when using the TransactionalTestExecutionListener ("is depended on by")
    • #14850 Implement JUnit 4 Support using Rules ("is duplicated by")
    • #9965 Add support for parameterized JUnit 4 tests in the Spring TestContext Framework

    25 votes, 30 watchers

    in: test type: enhancement has: votes-jira 
    opened by spring-projects-issues 41
  • Allow to ignore null value for copyProperties()

    Allow to ignore null value for copyProperties()

    I try to use BeanUtils.copyProperties in my local project and looking for ways to avoid copying null value. I saw this close pull request. I try to make it more compatible.

    status: waiting-for-triage 
    opened by human-user 2
  • Double-quoted header values are not unquoted/unescaped and then treated as single members

    Double-quoted header values are not unquoted/unescaped and then treated as single members

    Affects: 6.0.3


    According to https://www.rfc-editor.org/rfc/rfc9110.html#section-5.5-8, the need of having , commas (and " double-quotes) in header values introduces the need of double-quoting header values, so that a comma in a header value can be distinguished from a comma delimiter for list-based fields.

    However for example HttpHeaders.getValuesAsList(), which was introduced for #18797:

    @RestController
    class DemoController {
    	@GetMapping("/headers")
    	List<String> getHeaders(@RequestHeader HttpHeaders headers) {
    		return headers.getValuesAsList("Example-Dates");
    	}
    }
    

    If I send the example header from the RFC to it:

    $ curl http://127.0.0.1:8080/headers -H 'Example-Dates: "Sat, 04 May 1996", "Wed, 14 Sep 2005"'
    ["\"Sat","04 May 1996\"","\"Wed","14 Sep 2005\""]
    

    I think this should return ["Sat, 04 May 1996", "Wed, 14 Sep 2005"] instead.

    status: waiting-for-triage 
    opened by Frederick888 0
  • Add MediaType.TEXT_CSS

    Add MediaType.TEXT_CSS

    Add new MediaType "text/css" and TEXT_CSS_VALUE constant to more easily define a CSS resource in spring web. Text/CSS is a standard MIME_Type and MediaType

    status: waiting-for-triage 
    opened by IAmLuisJ 0
  • HttpExchange interface method validation support

    HttpExchange interface method validation support

    I want to validate the params on client side, it works fine when using spring-cloud-openfeign, but it doesn't work when using HttpExchange.

    @Validated
    public interface EchoClient {
        @GetExchange("/echo")
        String echo(@RequestParam("message") @NotNull String message);
    }
    
    status: waiting-for-triage in: web 
    opened by DanielLiu1123 3
  • CSRF token not avaialble to freemarker templates in SpringBoot 3

    CSRF token not avaialble to freemarker templates in SpringBoot 3

    Hi Team!

    After upgrading to SpringBoot 3 a freemarker form no longer renders because the _csrf attribute is null.

    Sample app (technically it's not rendering _csrf in a form, but it's the same problem): https://github.com/ardetrick/springboot3-freemarker-csrf-issue

    There is a work-around where setting spring.freemarker.expose-request-attributes=true resolves the issue, however, this does not seem like the correct fix.

    I recognize that there have been a few changes to Spring Security and CSRF as part of upgrading Spring Security from 5 to 6, however, the spring security team does not believe this issue is related. https://github.com/spring-projects/spring-security/issues/12462#issuecomment-1373957266.

    In addition, at least one other person has also noted this issue: https://github.com/spring-projects/spring-security/issues/12462#issuecomment-1373911441.

    Thanks for the help!

    in: web type: regression 
    opened by ardetrick 2
Releases(v6.0.3)
  • v6.0.3(Dec 15, 2022)

    :star: New Features

    • Throw PessimisticLockingFailureException/CannotAcquireLockException instead of plain ConcurrencyFailureException #29675
    • Introduce additional constructors in MockClientHttpRequest and MockClientHttpResponse #29670
    • Fall back to JdkClientHttpConnector as ClientHttpConnector #29645
    • Optimize object creation in RequestMappingHandlerMapping#handleNoMatch #29634
    • Align multipart codecs on client and server #29630
    • Deprecate "application/graphql+json" media type after spec changes #29617
    • HTTP interface client does not call FormHttpMessageWriter when writing form data #29615
    • ProblemDetail doesn't override the equals method #29606
    • Add title to SockJS iFrames for accessibility compliance #29594
    • Forbid loading of a test's ApplicationContext in AOT mode if AOT processing failed #29579
    • Deprecate JettyWebSocketClient in favor of StandardWebSocketClient #29576
    • Improve options to expose MessageSource formatted errors for a ProblemDetail response #29574
    • Make @ModelAttribute and @InitBinder annotations @Reflective #29572
    • Update BindingReflectionHintsRegistrar to support properties on records #29571

    :lady_beetle: Bug Fixes

    • Cannot use WebDAV methods in Spring MVC 6.0 anymore #29689
    • AnnotatedElementUtils.findMergedRepeatableAnnotations does not fetch results when other attributes exist in container annotation #29685
    • BeanWrapperImpl NPE in setWrappedInstance after invoking getPropertyValue #29681
    • SpEL ConstructorReference does not generate AST representation of arrays #29665
    • NullPointerException in BindingReflectionHintsRegistrar for anonymous classes #29657
    • DataBufferInputStream violates InputStream contract #29642
    • Component scanning no longer uses component index for @Named, @ManagedBean, and other Jakarta annotations #29641
    • Fix canWrite in PartHttpMessageWriter #29631
    • NoHandlerFoundException mistakenly returns request headers from ErrorResponse#getHeaders #29626
    • URI override for @HttpExchange doesn't work if there are both URI and @PathVariable method parameters #29624
    • Unnecessary parameter name introspection for constructor-arg resolution (leading to LocalVariableTableParameterNameDiscoverer warnings) #29612
    • Set detail from reason in both constructors of ResponseStatusException #29608
    • SpEL string literal misses single quotation marks in toStringAST() #29604
    • AOT code generation fails for bean of type boolean #29598
    • request-scoped bean with @Lazy fails in native image (due to missing detection of CGLIB lazy resolution proxies) #29584
    • 500 error from WebFlux when parsing Content-Type leads to InvalidMediaTypeException #29565
    • ConcurrentLruCache implementation is using too much heap memory #29520
    • Duplicate key violation gets translated to DataIntegrityViolationException instead of DuplicateKeyException in Spring 6 #29511
    • SpEL: Two double quotes are replaced by one double quote in single quoted String literal (and vice versa) #28356

    :notebook_with_decorative_cover: Documentation

    • Fix ErrorResponse#type documentation #29632
    • Fix typo in observability documentation #29590
    • Consistent documentation references to Jakarta WebSocket (2.1) #29581
    • Unrendered asciidoc headings in reference documentation #29569
    • Document observability support #29524

    :hammer: Dependency Upgrades

    • Upgrade to Apache HttpClient 5.2 #29627
    • Upgrade to Gradle 7.6 #29583
    • Upgrade to Micrometer 1.10.2 #29678
    • Upgrade to Reactor 2022.0.1 #29679

    :heart: Contributors

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

    @Aashay-Chapatwala, @CoderYellow, @ShenFeng312, @Spark61, @divcon, @izeye, @koo-taejin, @mdeinum, @mhalbritter, @quaff, and @singhbaljit

    Source code(tar.gz)
    Source code(zip)
  • v6.0.2(Nov 24, 2022)

    :star: New Features

    • Rely on standard parameter name resolution in Bean Validation 3.0 #29566

    :lady_beetle: Bug Fixes

    • ResponseStatusException does not use the reason to set the "detail" field #29567
    • LocalVariableTableParameterNameDiscoverer logs many warnings with Hibernate validation #29563

    :notebook_with_decorative_cover: Documentation

    • org.springframework.web.multipart.commons not found #29562
    Source code(tar.gz)
    Source code(zip)
  • v6.0.1(Nov 23, 2022)

    :star: New Features

    • Make SourceHttpMessageConverter optional #29535
    • Deprecate LocalVariableTableParameterNameDiscoverer completely (avoiding its exposure in native images) #29531
    • Make GeneratorStrategy.generate unreachable on native #29521
    • Update LogAdapter to allow build-time code removal #29506

    :lady_beetle: Bug Fixes

    • Unhandled exceptions should mark Servlet observation outcome as error #29512

    :notebook_with_decorative_cover: Documentation

    • Broken link in documentation section 6.10 #29554
    • Fix Javadoc link text in BindingResult #29551
    • Fix some typos in Kotlin WebClient example code #29538
    • Fix link to Bean Utils Light Library in BeanUtils Javadoc #29534
    • Fix link to WebFlux section in reference manual #29525
    • Document RuntimeHints testing strategies #29523
    • Reorganize and modularize the Testing chapter in the reference manual #29522
    • Document switch to SQLExceptionSubclassTranslator in the upgrade guide #29518
    • Update documentation to mention Java 17+ baseline #29514
    • Link to Spring WebFlux section is broken #29513
    • Update javadoc of Jackson-based decoders to reflect 2.14 baseline #29508
    • Code example has callout from a different code example #29505
    • Code listing callouts are displayed incorrectly in core-beans.adoc #29457
    • Fix a syntax error in an XML listing in core-validation.adoc #29456

    :hammer: Dependency Upgrades

    • Upgrade to Jackson 2.14.1 #29539
    • Upgrade to Kotlin 1.7.21 #29543

    :heart: Contributors

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

    @Encyclopedias, @andregasser, @davidcostanzo, @divcon, @jiangying000, @mdeinum, and @wilkinsona

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0(Nov 16, 2022)

    See What's New in Spring Framework 6.x and Upgrading to Spring Framework 6.x for upgrade instructions and details of new features.

    :star: New Features

    • Avoid direct URL construction and URL equality checks #29486
    • Simplify creating RFC 7807 responses from functional endpoints #29462
    • Allow test classes to provide runtime hints via declarative mechanisms #29455

    :notebook_with_decorative_cover: Documentation

    • Align javadoc of DefaultParameterNameDiscoverer with its behavior #29494
    • Document AOT support in the TestContext framework #29482
    • Document Ahead of Time processing in the reference guide #29350

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2022.0.0 #29465

    :heart: Contributors

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

    @ophiuhus and @wilkinsona

    Source code(tar.gz)
    Source code(zip)
  • v5.3.24(Nov 16, 2022)

    :star: New Features

    • Avoid reflection for annotation method invocations #29448
    • Avoid unnecessary allocations in StompDecoder#unescape #29443
    • Avoid String allocations in MediaType.checkParameters #29428
    • Reduce allocations caused by producible media types #29412
    • Provide optional SimpleBeanInfoFactory for better introspection performance in 5.3.x #29330
    • Filter out null WebSocket session attributes #29315
    • Introduce TestSocketUtils as a replacement for SocketUtils #29132
    • Avoid Commons Logging API for using LoggingCacheErrorHandler with a custom logger #28678

    :lady_beetle: Bug Fixes

    • Missing SessionFactory property (filter AutoCloseable from PropertyDescriptors) #29480
    • SpEL ternary and Elvis expressions are missing enclosing parentheses in toStringAST() #29463
    • If-Unmodified-Since header check removes Last-Modified and Etag headers from response, even if condition passes #29362
    • Annotation searches fail for non-public repeatable annotations #29301
    • AbstractBeanFactory's interaction with BeanPostProcessorCacheAwareList is not fully thread-safe #29299
    • WebTestClient cannot assert custom HTTP status code #29283
    • Body token not expected error when trying to upload a large multipart file #29227
    • Avoid resizing of Maps created by CollectionUtils #29190
    • DefaultWebClient logging sensitive information in URI #29148
    • Fix SimpleMailMessage nullability annotations #29139
    • Webflux fails to apply the rule for controller methods returning void to kotlin suspend functions returning Unit #27629
    • Resource.isFile() return true when the resource path actually not exists #26707
    • AnnotatedElementUtils does not find merged repeatable annotations on other repeatable annotations #20279

    :notebook_with_decorative_cover: Documentation

    • Fix two typos in integration.adoc and webflux.adoc #29469
    • Fix typo: "as describe in" -> "as described in" #29393
    • Fix typos #29364
    • Correct documentation for "other return values" from a web controller method #29349
    • Document how to use WebJars without webjars-locator-core dependency #29322
    • Update RestTemplate Javadoc with regards to setting interceptors on startup vs at runtime #29311
    • Document how to switch to the default set of TestExecutionListeners #29281
    • Document limitation of AopTestUtils.getUltimateTargetObject() regarding non-static TargetSource #29276
    • Fix typo in WebSocket reference doc regarding subscription header #29228
    • Fix MockMvc sample setup #29201

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2020.0.25 #29464

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-RC4(Nov 9, 2022)

    :star: New Features

    • Introduce DataFieldMaxValueIncrementer for SQL Server sequences #29447
    • Introduce findAllAnnotationsOnBean variant on ListableBeanFactory #29446
    • Introduce support for Jakarta WebSocket 2.1 #29436
    • Allow @ControllerAdvice in WebFlux to handle exceptions before a handler is selected #22991

    :lady_beetle: Bug Fixes

    • Bean with unresolved generics do not use fallback algorithms with AOT #29454
    • TomcatRequestUpgradeStrategy is not compatible with Tomcat 10.1 #29434
    • Autowiring of a generic type produced by a factory bean fails after AOT processing #29385

    :notebook_with_decorative_cover: Documentation

    • Reference PDF containing full docs not available #28451

    :hammer: Dependency Upgrades

    • Revisit Servlet API baseline: Servlet 6.0 in the build, Servlet 5.0 compatibility at runtime #29435
    • Upgrade to Context Propagation 1.0.0 #29442
    • Upgrade to Jackson 2.14.0 #29351
    • Upgrade to Micrometer 1.10.0 #29441

    :heart: Contributors

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

    @divcon, @fmbenhassine, @imkulwant, @izeye, and @wilkinsona

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-RC3(Nov 3, 2022)

    :star: New Features

    • Support @RequestPart arguments for @HttpExchange methods #29420
    • Processing of charset in Content-Type Header not case-insensitive #29416
    • Allow for external customization and i8n of the "title" of an RFC 7807 response #29407
    • Automatically register directories for registered resource hints #29403
    • Allow registration of resource hint for root directory #29402
    • Load ApplicationContextFailureProcessor implementations from spring.factories #29387
    • Simplify mapping of custom exception to an RFC 7807 response in ResponseEntityExceptionHandler #29384
    • Introduce SimpleValueStyler for use with ToStringCreator #29381
    • Make DefaultValueStyler extensible #29380
    • Introduce DataFieldMaxValueIncrementer for MariaDB #29379
    • Handle case where ResponseEntity and ProblemDetail don't agree on the HTTP status to use #29378
    • Provide AOT support for HttpServiceProxyFactory clients #29271
    • Revise logging in the TestContext framework #29229

    :lady_beetle: Bug Fixes

    • Align server observation contextual names with OTel semantic conventions #29424
    • Matching path pattern is not set in reactive ServerRequestObservationContext #29422
    • PartEvent upload fails with JdkClientHttpConnector #29400
    • Native image FileSystem should not be closed after classpath scanning #29397
    • AOT processing loses bean aliases #29391
    • WebClient and WebFlux Observation do not propagate context #29388
    • HttpServiceProxyFactory raises IllegalStateException if created through the builder and declared as a bean #29376
    • Multiple @ImportRuntimeHints in the type hierarchy should be supported #29361

    :hammer: Dependency Upgrades

    • Upgrade to Jackson 2.14.0-rc3 #29405

    :heart: Contributors

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

    @fmbenhassine, @imkulwant, @izeye, and @marcingrzejszczak

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-RC2(Oct 20, 2022)

    :star: New Features

    • Ensure classpath checks can be evaluated at build-time #29352
    • Register reflection hints for JPA persistence callbacks #29348
    • Check @RegisterReflectionForBinding specifies at least one class #29346
    • Introduce builder API for AOT processor Settings #29341
    • Allow in-progress AOT processing to be detected #29340
    • Reorganize HTTP Observation types #29334
    • Perform basic property determination without java.beans.Introspector #29320
    • Add Kotlin data class components support to BindingReflectionHintsRegistrar #29316
    • Switch HttpServiceFactory and RSocketServiceProxyFactory to builder model for programmatic configuration first #29296
    • Introduce PreComputeFieldFeature based on GraalVM FieldValueTransformer API #29081
    • Introduce SPI for processing ApplicationContext failures in the TestContext framework #28826
    • SimpleEvaluationContext should disable array allocation #28808
    • DateTimeFormatterRegistrar should fall back to ISO parsing by default #26985

    :lady_beetle: Bug Fixes

    • Avoid NPEs in DefaultServerRequestObservationConvention #29359
    • ServerHttpObservationFilter can throw ClassCastException when NoopObservation used #29356
    • ServerHttpObservationFilter should not overwrite response status #29353
    • Possible regression in PathMatchingResourcePatternResolver #29333
    • Jackson Decoder ignores method parameter information when resolving media types for custom ObjectMapper registration #29307
    • Deprecation warning for composed Bean Validation constraint annotation #29206
    • Code generation no longer supports a list of inner BeanDefinitions #29075
    • NamedParameterUtils has broken square brackets handling #27925

    :notebook_with_decorative_cover: Documentation

    • Refine @RegisterReflectionForBinding Javadoc #29345
    • Mention @ImportRuntimeHints in RuntimeHintsRegistrar Javadoc #29337
    • Add Javadoc since for SimpleInstantiationStrategy.setCurrentlyInvokedFactoryMethod() #29326
    • Use correct RFC number for ProblemDetail support in Javadoc #29302

    :hammer: Dependency Upgrades

    • Upgrade to Derby 10.16 #29344
    • Upgrade to GraalVM 22.3.0 #29080
    • Upgrade to Jackson 2.14.0-rc2 #29343

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-RC1(Oct 12, 2022)

    :star: New Features

    • Add native support for ExceptionHandler and ProblemDetail #29297
    • Refine SQLErrorCodesFactory reachability on native images #29294
    • Refine BindingReflectionHintsRegistrar infrastructure #29279
    • Normalize URIs returned from FileSystemResource.getURI() #29275
    • Redesign AOT Processors #29266
    • Simplify TestRuntimeHintsRegistrar API #29264
    • UrlResource#getFilename() should return unencoded file name #29261
    • Add reflection hints for EmbeddedDatabaseFactory$EmbeddedDataSourceProxy#shutdown #29259
    • Change keyvalue name to http.url in server observations #29254
    • Code generator should not use reflection for protected artifacts #29253
    • Use MethodArgumentNotValidException for model attribute arguments #29251
    • Allow TestCompiler SourceFile to work with records #29236
    • Generate matching inner class for inner class configuration #29213
    • Kotlin functional config DSL should prevent beans to be registered twice in AOT-optimized contexts #29211
    • Allow BeanRegistration target to be any arbitrary class name #29207
    • Add support for Charset to value code generator #29186
    • Enable HTTP and HTTPS on native in spring-web module #29185
    • Optimize native footprint by avoiding using ModuleFinder.ofSystem() at runtime #29183
    • Introduce AotProcessor to invoke the AOT engine on an application #29181
    • Move TestCompiler to dedicated package #29175
    • Use java.nio and FileSystems to resolve files in PathMatchingResourcePatternResolver #29163
    • Replace ApplicationContextAotInitializer with an AotApplicationContextInitializer interface #29157
    • Enable default TestExecutionListeners in JUnit 4 and TestNG base test classes #29149
    • Support cglib generated classes with TestCompiler #29141
    • Infer AOT proxies created by ProxyFactoryBean #29097
    • HTTP interface client ignores @DateTimeFormat on path variable #29095
    • Integrate the Micrometer Context Propagation library #29056
    • Upgrade RestTemplate to HttpClient 5 #28925
    • Improve resource handling for empty files contained in jars #28850
    • Allow for external customization and i8n of the "detail" of an RFC 7807 response #28814
    • Revise CookieLocaleResolver to use ResponseCookie #28779
    • Optimize SpEL and property placeholder support for @Async qualifiers #28549
    • Customization for ObjectReader and ObjectWriter #28401
    • Improve exception message if MultipartParser can not find end of body #28067
    • Revisit AOT constructor and factory method resolution #27920
    • Support CBOR and Protobuf with Kotlin Serialization #27628
    • CGLIB does not allow packages to start with "java" #27622
    • Support comma-delimited list of origin patterns in @CrossOrigin #27606
    • Improve the fluency of the ResponseCreator API #27280
    • Support for problem details based on RFC 7807 #27052
    • Add fast-path for no-args constructor in BeanUtils.instantiateClass #24104
    • Resolve generic type in more complex scenarios #23418

    :lady_beetle: Bug Fixes

    • Hints for CGLIB proxies are not consistently registered #29295
    • Ensure context caching works properly during AOT runtime in the TestContext framework #29289
    • AbstractJackson2Encoder encodes empty Flux to invalid JSON #29274
    • RuntimeHints accessors have inconsistent naming #29269
    • ClassPathResources with same absolute path and same ClassLoader should be equal #29263
    • HTTP URL KeyValue should provide entire request URL as a value #29257
    • Hints for cglib configuration classes are not registered with a valid name #29252
    • Add ConstantReadableJavaField caching in ConstantFieldSubstitutionProcessor #29250
    • StringUtils should parse locale strings without country but with variant #29248
    • Generated code does not take visibility of method if it is defined in a parent class #29245
    • RestTemplate Observation is started without a complete tracing context #29234
    • Fix Outcome KeyValues in HTTP observations #29232
    • HTTP ObservationConvention implementations miss contextualName #29231
    • Refine ConstantFieldSubstitutionProcessor error handling #29219
    • Align RuntimeHintsAgent behavior with GraalVM reflection changes #29205
    • Class meta-annotated with @Reflective and annotated with @RegisterReflectionForBinding is only processed by SimpleReflectiveProcessor #29193
    • Spring Web 6.0.0-M6 breaks Kotlin support for (De-)Serialization in some edge-cases #29192
    • BeanDefinitionMethodGenerator should not generate code in the javax package name #29123
    • CGLIB proxies are not used at runtime on @Configuration classes in AOT mode #29107
    • Remove call to requestCompleted in RequestMappingHandlerAdapter #29002

    :notebook_with_decorative_cover: Documentation

    • Document PartEvent API #29170
    • Switch to spring-asciidoctor-backends #29162
    • Improve Javadoc of BeanRegistrationAotProcessor to describe the "runtime replacement use case" #29126
    • Improve Javadoc of GeneratedMethods#add to describe naming conventions #28997

    :hammer: Dependency Upgrades

    • Update Reactor Netty 2.0 version to 2.0.0-SNAPSHOT #29247
    • Upgrade to ASM 9.4 #29305
    • Upgrade to Context Propagation 1.0.0-RC1 #29273
    • Upgrade to JUnit 5.9.1 #29179
    • Upgrade to Kotlin 1.7.20 #29225
    • Upgrade to Micrometer 1.10.0-RC1 #29241
    • Upgrade to Reactor 2022.0.0-RC1 #29268

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-M6(Sep 15, 2022)

    :star: New Features

    • Add HandshakeWebSocketService runtime hints #29146
    • Add className variants in ReflectionHintsPredicates for checking fields and methods #29143
    • Set hibernate.bytecode.provider to none on native image #29140
    • Add proxy hints for org.hibernate.SessionFactory & org.hibernate.Session #29138
    • DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl is unable to resolve root url in native image #29137
    • Adapt FieldHint to recent GraalVM versions #29130
    • Deprecate StreamUtils.emptyInput() #29125
    • Improve exception message when the code for a value could not be generated #29118
    • Deprecate support for theme #29114
    • Add resource hints for HtmlCharacterEntityReferences.properties #29112
    • Introduce AotTestAttributes mechanism in the TestContext framework #29100
    • Return absolute path without leading slash from ClassPathResource#getPath #29099
    • Register runtime hints for types exposed via PersistenceManagedTypes #29096
    • Remove deprecated SynthesizedAnnotation interface #29092
    • Add support for providing JNI runtime hints #29085
    • Introduce registerResource(Resource) in ResourceHints #29083
    • Introduce AotTestExecutionListener API in the TestContext framework #29070
    • Introduce TestRuntimeHintsRegistrar in the TestContext framework #29069
    • Use serializerOrNull in Kotlin Serialization support #29068
    • Align RuntimeHintsPredicates with new FieldMode #29063
    • Remove support for setting default CacheAwareContextLoaderDelegate via system property #29061
    • Avoid shipping AWT classes in native images #29060
    • Stop using RuntimeHintsUtils to register SynthesizedAnnotation proxies #29059
    • Remove obsolete RuntimeHintsUtils #29058
    • Deprecate SynthesizedAnnotation and related methods #29053
    • Stop implementing SynthesizedAnnotation in annotation proxies #29041
    • Introduce logging for ContextCustomizer[Factory] to improve diagnostics #29036
    • Avoid reflection for instantiating MockServerContainerContextCustomizer #29035
    • Skip ContextCustomizerFactory that cannot be loaded #29034
    • Register runtime hints for TestContext framework classes #29028
    • Register runtime hints for @Sql scripts #29027
    • Register runtime hints for @WebAppConfiguration attributes #29026
    • Register runtime hints for @TestPropertySource attributes #29025
    • Register runtime hints for @TestExecutionListeners attributes #29024
    • Register runtime hints for @BootstrapWith attributes #29023
    • Register runtime hints for ActiveProfilesResolver #29022
    • Register runtime hints for @ContextConfiguration attributes #29021
    • Remove remaining native build-time class initializations #29018
    • Introduce TypeHint.Builder#onReachableType(Class<?>) #29017
    • Harmonize registration of reflection hints #29011
    • Revisit resource cleanup in RestTemplate and ClientHttpRequestFactory #29010
    • Allow MethodReference to support a more flexible signature #29005
    • Refine JacksonModulesRuntimeHints #29001
    • Add hint for use of @Qualifier as a meta-annotation #29000
    • Lazy Validator resolution in MethodValidationPostProcessor #28990
    • Infer JDK dynamic proxies for Spring beans #28980
    • Contribute @PropertySource declarations in AOT optimized contexts #28976
    • Expose registrar for @Reflective #28975
    • Revisit our annotation support now that annotations are available in a native image without a dedicated hint #28967
    • Increase StreamUtils.BUFFER_SIZE to 8192 #28965
    • Update StreamUtils drain and emptyInput to use JDK builtins #28961
    • Integrate class proxy generation in AOT processing #28954
    • RuntimeHintsUtils.registerAnnotation should not register SynthesizedAnnotation proxy for @AliasFor #28953
    • Allow null argument for ResponseEntity.DefaultBuilder.eTag(String etag) #28947
    • Remove the need for reflection for OptionalValidatorFactoryBean #28939
    • Rename generateApplicationContext() in ApplicationContextAotGenerator #28927
    • Remove deprecated GenericPropertiesContextLoader from the TestContext framework #28911
    • Introduce AotContextLoader SPI in the TestContext framework #28906
    • Deprecate methods in ContextLoader API in the TestContext framework #28905
    • Make BootstrapUtils.resolveTestContextBootstrapper() public #28891
    • Introduce RuntimeHintsUtils#registerComposableAnnotation #28887
    • Instrument MVC and WebFlux for Observability #28880
    • Introduce TestGenerationContext #28877
    • Support Netty 5's Buffer API #28874
    • Support for Netty 5 #28847
    • Harmonize visibility of RuntimeHints builders #28835
    • Introduce command-line application for triggering AOT test context processing #28825
    • Introduce TestClassScanner to locate Spring test classes for AOT processing #28824
    • Allow empty path in MockMvc #28823
    • AOT-generated code for a FactoryBean should have a better location #28812
    • Add support for SchedulerFactoryBean in native-image #28725
    • EnableAsync doesn't work in native-image #28710
    • Improve test coverage of RdbmsOperation #28472
    • Treat MariaDB as an independent database type #28355
    • Instrument HTTP clients for Observability #28341
    • Deprecate ignoreDefaultModelOnRedirect property and set to true by default #28324
    • Allow to provide a pre-computed scan PersistenceUnitManager #28287
    • Make use of new HtmlUnit API for access request parameters #28240
    • Add support in the TCF to use pre-processed AOT contexts #28205
    • Add support for processing test contexts ahead-of-time #28204
    • Introduce AOT generated class proxies #28115
    • Deprecate SpringFactoriesLoader#loadFactoryNames #27954
    • Deprecate ListenableFuture in favor of CompletableFuture #27780
    • Revisit ConcurrentLruCache implementation #26320
    • Support to Create Proxy for RSocket Client From Annotated Interface #24456

    :lady_beetle: Bug Fixes

    • BufferClosedException when decoding to Flux in StringDecoder #29119
    • RuntimeHintsAgent should not require full reflection on types #29091
    • Hint for resource pattern with leading slash is not applied in native image #29088
    • ResourceHintsPredicates.forResource(TypeReference,String) doesn't support default package #29086
    • Reflection field hints can downgrade allowWrite #29055
    • Misleading error message when no constructor or factory method can be found #29052
    • IllegalAccessException while instrumenting invocation of non-public method with RuntimeHintsAgent #29046
    • Error handling no longer works for JSON controller method returning Flux under 6.0.0-M5 #29038
    • @Order is not available in native image #28988
    • AbstractTestContextBootstrapper should not log stack trace when skipping a TestExecutionListener #28962
    • MergedBeanDefinitions change can be lost if bean is instantiated #28948
    • refreshForAotProcessing should freeze the configuration before invoking MBDPP #28941
    • Different order of invocations for ImportAware and EmbeddedValueResolverAware with AOT-optimized contexts #28915
    • Native reflection configuration should consider beanClass attribute of bean definitions #28913
    • RecordedInvocation instance resolution is inconsistent #28907
    • CompileWithTargetClassAccessExtension fails to select overloaded test methods #28901
    • Ensure CompileWithTargetClassAccessExtension only uses the Jupiter TestEngine #28900
    • JPA exception mapping fails with Hibernate 6.1.1 in spring 6.0.0-M5 #28855
    • Fix inferred methods code generation #28843
    • AOT-generated code does not consider by-type RuntimeBeanReferences #28841
    • ContentDisposition does not handle quoted pairs when parsing #28837
    • Absence of dependencies for optional TestExecutionListener breaks integration tests #28828
    • AOT generated code should consider visibility of FactoryBean target type #28809
    • InstantiationAwareBeanPostProcessor implementations are not invoked with an AOT-processed context #28777
    • RuntimeHintsUtils#registerAnnotation fails to register SynthesizedAnnotation proxy #28767
    • Factory method is lost for AOT-processed beans that do not require autowiring #28748
    • Bean definition contribution includes attributes that are not used at runtime #28516
    • Code generation should not contribute (inferred) destroy method name #28215

    :notebook_with_decorative_cover: Documentation

    • Add examples to Javadoc for Throwing*.of factory methods #28969
    • Fix typo in BasicJsonWriter.java #28890

    :hammer: Dependency Upgrades

    • Upgrade to JUnit 5.9.0 #28752
    • Upgrade to Micrometer 1.10.0-M6 #29151
    • Upgrade to Reactor 2022.0.0-M6 #29128

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.23(Sep 15, 2022)

    :star: New Features

    • Introduce AnnotationUtils.isSynthesizedAnnotation(Annotation) #29054
    • Introduce createContext() factory method in AbstractGenericWebContextLoader #28983
    • Support TreeSet collection type in CollectionFactory.createCollection() without using reflection #28949
    • Document when RequestEntity.getUrl() throws an UnsupportedOperationException #28930
    • Deprecate NestedIOException #28929
    • Make isConnected() in WebSocketConnectionManager public #28785
    • Expose headers from STOMP RECEIPT frame to registered callbacks #28715
    • Make WebClientException serializable #28321

    :lady_beetle: Bug Fixes

    • Ordering inconsistency with beans defined in parent context #29105
    • RelativeRedirectResponseWrapper does not commit response in sendRedirect #29050
    • MockServerContainerContextCustomizerFactory does not support @Nested tests #29037
    • Request to improve KotlinSerializationJsonHttpMessageConverter logic in RestTemplate #29008
    • WebFlux: multipart requests hang sometimes #28963
    • DataBufferUtils.write(Publisher, Path) loses context #28933
    • connectionTimeOut and readTimeout not working on UrlResource #28909
    • SockJsServiceRegistration#setSupressCors has a typo and should be deprecated #28853
    • RenderingResponse does not set status code on redirect views #28839
    • Avoid IllegalArgumentException when setting WebSocket error status #28836
    • Loss of context path after using ServerRequest.from #28820
    • ResponseCookie does not declare nullability annotations consistently for domain and path #28780

    :notebook_with_decorative_cover: Documentation

    • Fix typo in data-access section #29048
    • Correct description of @RequestParam with WebFlux #28944
    • Fix broken kdoc-api links in kotlin.adoc #28908
    • Fix typos in Javadoc of class AbstractEncoder #28885
    • Fix links in Javadoc and reference docs #28876
    • Add missing closing parenthesis in reference doc #28867
    • Fix typos in Javadoc, reference docs, and code #28822
    • Replace use of the <tt> HTML tag in Javadoc #28819
    • Fix broken link in rsocket documentation #28817
    • Clarify docs on JNDI properties in Servlet environment #28488
    • Improve documentation of Caching annotations #28183

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2020.0.23 #29129

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-M5(Jul 14, 2022)

    :star: New Features

    • HibernateTransactionManager compatibility with Hibernate 6.0/6.1 #28813
    • Reject JDK proxy hint registration for sealed interfaces #28786
    • Provide SerializationHintsPredicates in RuntimeHintsPredicates #28772
    • Deprecate convention-based annotation attribute overrides in favor of @AliasFor #28760
    • Add native image support for WebSocket STOMP messaging #28754
    • Simplify hint registration for Spring AOP proxies #28745
    • Only use JPMS exports as we don't need reflection access #28733
    • Open GraalVM internals to the ConstantFieldFeature #28732
    • Add support for records in BindingReflectionHintsRegistrar #28721
    • Replace java.util.Date and TimeUnit usage in scheduling with appropiate java.time classes #28714
    • Jackson well-known module support in native image #28709
    • RuntimeHints missing for WebFlux #28701
    • Add runtime hints for AbstractHandshakeHandler #28697
    • native-image: Problem with Scheduled annotation #28696
    • native-image: Support for MethodValidationPostProcessor #28689
    • native-image: Field 'PROPAGATION_REQUIRED' not found in class TransactionDefinition #28688
    • Allow dynamic properties in ProblemDetail #28665
    • Add Kotlinx Serialization support to BindingReflectionHintsRegistrar #28635
    • Add ResourceHints registrar for classpath patterns #28626
    • Replace build-time initialization by constant field evaluation at build-time #28624
    • Add reflection hints for data binding in Web controllers #28623
    • Add reflection hints for HttpEntity used in Web controllers #28622
    • Introduce ResourcePatternHint#toRegex #28620
    • Add ifPresent utility methods on RuntimeHints #28617
    • Register native hints for jakarta.inject annotations #28614
    • Use PathPatternParser by default in Spring MVC #28607
    • Support that the same RuntimeHintsRegistrar can be specified multiple times and invoked only once #28594
    • Rationalize naming strategy in ApplicationContextAotGenerator #28585
    • Add minimal Kotlin DSL RouterFunction attributes support #28569
    • Introduce attribute support in Kotlin RouterFunction DSL #28567
    • Allow ApplicationContextAotGenerator to generated better class names #28565
    • Allow BeanRegistrationAotContributions to provide BeanRegistrationCodeFragments customization #28557
    • Introduce RuntimeHints predicates utilities #28555
    • Deprecate trailing slash match and change default value from true to false #28552
    • Improve options for exception handling in HTTP interface client #28533
    • Add reflection hints for Web controllers #28518
    • Ambiguous behavior for ClassNameGenerator::generateClassName #28517
    • Support module path scanning for "classpath*:" resource prefix #28506
    • Refactor HttpServiceProxyFactory to be suitable as an infrastructure bean #28505
    • Allow custom HTTP method with @HttpExchange methods #28504
    • Create UrlResource factory methods that throw unchecked exceptions #28501
    • Introduce utility to register hints for an annotation that uses AliasFor #28497
    • Support property placeholders in url attribute of @HttpExchange #28492
    • Support default methods in @HttpExchange interface #28491
    • Introduce AotDetector mode #28474
    • Introduce a meta-annotation that indicates the annotated element requires reflection hints #28469
    • Add level guards for trace logging in SpringFactoriesLoaderRuntimeHintsRegistrar #28465
    • Add resolver for request attributes for @HttpExchange methods #28458
    • Add WebFlux equivalent of ResponseEntityExceptionHandler #28439
    • Avoid collectList when sending a Flux of objects as JSON using WebClient #28398
    • Avoid loading XML files for default SQL exception translation #28216
    • Refine runtime hint conditions #28126
    • Provide testing infrastructure for RuntimeHints #27981
    • Simplify default locale/timezone resolution in cookie/session locale resolvers #27609
    • Nested Exception's message should not include the messages from causal chain #25162
    • Add If-Match support and improve If-None-Match wildcard support #24881

    :lady_beetle: Bug Fixes

    • Guard against NPE in PathMatchConfigurer #28816
    • AnnotationTypeMapping tracks @AliasFor mappings as convention-based #28773
    • Support by-type constructor references in ConstructorOrFactoryMethodResolver #28728
    • AOT generated code leads to exception on startup: Object of class [java.lang.Boolean] must be an instance of boolean #28727
    • HtmlUnit / MockMvc integration handles forwarded URLs partially #28722
    • StackOverflowError when using BindingReflectionHintsRegistrar #28683
    • Wrong reflection hints for arrays of inner types #28664
    • Add automatic hint for autowired field support #28655
    • Reflection configuration for parameter types with an inner class have wrong name #28606
    • Fix ResourceHintsWriter for leading/trailing wildcards #28597
    • JdkHttpClientResourceFactory has dependency on org.eclipse.jetty #28588
    • CompileWithTargetClassAccessClassLoader does not implement findResource #28574
    • ScopedProxyBeanRegistrationAotProcessor is never called #28561
    • Proxy hint missing when AliasFor is used on the annotation itself #28528
    • Fix attribute return types in @DeleteExchange, @PatchExchange, and @PutExchange #28498
    • Correctly detect Optional return type for @HttpExchange methods #28493
    • Resolve package cycle around MissingServletRequestPartException #28455
    • findAnnotationOnBean finds annotations from a static @Bean method's enclosing class #28298

    :notebook_with_decorative_cover: Documentation

    • Fix WebClientAdapter.createHttpServiceProxyFactory() example in ref docs #28753
    • Remove obsolete references to @Required #28600
    • Improve ResourcePatternHint documentation #28598
    • Use getHost instead of getContainerIpAddress in Redis examples #28461
    • Update documentation for RFC 7807 support #28438

    :hammer: Dependency Upgrades

    • Upgrade client support to R2DBC 1.0 #28787
    • Upgrade Dokka to 1.7 #28641
    • Upgrade to Kotlin 1.7.0 #28619
    • Upgrade to Kotlin 1.7.10 #28784
    • Upgrade to Reactor 2022.0.0-M4 #28766

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.22(Jul 14, 2022)

    :star: New Features

    • Improve regex "." matching for URL paths #28815
    • Spring JDBC does not recognize LocalDate and LocalDateTime in javaType to sqlType Mapping #28778
    • ResolvableType.forInstance should return NONE for null instance #28776
    • Correctly identify MaxUploadSizeExceededException through keywords in message from Jetty 9.4.x #28759
    • Introduce StringUtils.trimAllWhitespace(CharSequence) #28757
    • Trim string input in Converters where whitespace is irrelevant #28756
    • Trim string input in PropertyEditors where whitespace is irrelevant #28755
    • Improve diagnostics for CGLIB ClassLoader issues on Java 9+ #28747
    • Create well-known non-interface types in CollectionFactory without using reflection #28718
    • Revise internals of LoggingCacheErrorHandler #28672
    • Simplify creation of LoggingCacheErrorHandler with logged stacktrace #28670
    • Fix DataSourceUtils inconsistent exception handling #28669
    • Introduce lenient parsing in DataSize regarding whitespace #28643
    • Support adding rather than replacing modules in Jackson2ObjectMapperBuilder #28633
    • Add MockMvcRequestBuilders.multipart(HttpMethod, String, Object...) #28631
    • Avoid parsing request body in DispatcherServlet for "parameters={masked}" log message #28587
    • Avoid synchronization in AbstractAspectJAdvice#calculateArgumentBindings #26377

    :lady_beetle: Bug Fixes

    • WebFlux multipart temporary file not deleted when the client disconnects early #28740
    • Ensure channelExecutors and taskScheduler in STOMP WebSocket config are qualified #28736
    • MockHttpServletResponse addHeader does not allow Comment part with Set-Cookie header #28730
    • Meta-annotations are unnecessarily synthesized in MergedAnotations #28704
    • GenericApplicationContext does not honor ProtocolResolver when a resource loader is set via setResourceLoader() #28703
    • R2DBC: @Transactional(readOnly) is applied to the connection before the transaction has begun #28610

    :notebook_with_decorative_cover: Documentation

    • Fix Kotlin code snippets language #28810
    • Fix typos in reference docs and project documentation #28805
    • Fix and improve Javadoc in spring-beans and spring-aop #28803
    • Fix and improve Javadoc in spring-core and spring-context #28802
    • Fix and improve Javadoc in spring-messaging, spring-jms and spring-expression #28800
    • Fix and improve Javadoc in spring-r2dbc, spring-oxm, spring-orm and spring-jdbc #28796
    • Fix and improve Javadoc in spring-test #28795
    • Fix and improve Javadoc in spring-tx #28794
    • Fix and improve Javadoc in spring-web #28791
    • Fix and improve Javadoc in spring-webflux #28790
    • Fix and improve Javadoc in spring-webmvc #28789
    • Fix and improve Javadoc in spring-websocket #28788
    • Fix Kotlin example for defines a custom @Production #28680
    • Fix a typo in ResponseEntity documentation #28647
    • Document that Kotlin inline classes are not supported yet #28642
    • Refine @Required Kotlin documentation to use annotation use site targets #28630
    • Fix Kotlin example for @ComponentScan basePackages attribute #28628
    • Kotlin examples for setter injection incorrectly use field injection #28596
    • Fix expectations in MockMvc Kotlin documentation #28301

    :hammer: Dependency Upgrades

    • Update to Bouncycastle 1.71 #28636
    • Upgrade to Reactor 2020.0.21 #28765

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.21(Jun 15, 2022)

    :star: New Features

    • Expose ThreadPoolTaskExecutor queue size and capacity for metrics #28583
    • Lazily initialize DataSize.PATTERN #28560
    • MockMvcWebTestClient forces HTTP POST for multipart requests #28545
    • Support for CGLIB BeanCopier utility on JDK 17 #28530
    • Allow changes to org.springframework.web log category at runtime #28477

    :lady_beetle: Bug Fixes

    • Avoid eager instantiation of non-singleton FactoryBean in getBeanNamesForType #28616
    • ObjectToObjectConverter doesn't consider return type of static methods #28609
    • Charset for input stream ignored in Jaxb2XmlDecoder #28599
    • Support RouterFunction ordering in Spring MVC #28595
    • Always construct new exception on error in DefaultWebClient #28550
    • HierarchicalUriComponents::getPort() throws NumberFormatException with invalid port in URI #28521
    • Cannot serve static resources with spaces from "file:" location when using PathPattern and UrlPathHelper is set to not decode #27791

    :notebook_with_decorative_cover: Documentation

    • Fix code sample for nested router functions #28603
    • Fix Kotlin example for @Required #28590
    • Fix Kotlin example for dependency injection with static factory method #28589
    • Update documentation regarding nested test class support #28579
    • Update reference docs to use PropertySourcesPlaceholderConfigurer #28572
    • Fix typo in webflux.adoc #28542
    • Fix Javadoc for DatabaseClient #28520
    • CachingConnectionFactory with WebLogic JMS not caching producers nor consumers #28500
    • Fix Kotlin example for static factory method #28399

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2020.0.20 #28612

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-M4(May 12, 2022)

    :star: New Features

    • Add native hints for core annotations #28442
    • Add byte[] to supported types in SimpleJmsHeaderMapper #28421
    • Add RootBeanDefinition constructor that accepts a ResolvableType #28418
    • Add Throwable functional interfaces #28417
    • Support multiple SpringFactoriesLoader files #28416
    • Add position variant of ObjectUtils.addObjectToArray #28415
    • Support for Jakarta Concurrency 3.0 #28400
    • Add header resolver for HttpExchange method #28395
    • FormHttpMessageConverter should not have a dependency on the Jakarta Mail API #28392
    • Support to Create a Proxy From an Annotated HTTP Service Interface #28386
    • BeanRegistrationContributionProvider should have access to the bean factory #28384
    • Generate appropriate AOT bean registration for scoped proxies #28383
    • AOT contribution for @PersistenceContext and @PersistenceUnit #28364
    • Return UnmodifiableMap in MVC PathVariableMapMethodArgumentResolver #28352
    • Allow to register AotContributingBeanFactoryPostProcessor declaratively #28342
    • Allow to register reflection hints for multiple types at once #28339
    • Add support for HEAD methods in Spring's Resource handling #28291
    • Initialize NativeDetector at build time #28244
    • Support multiple segments in encoded Content-Disposition #28236
    • Introduce HttpStatusCode interface #28214
    • Introduce fluent API for search options in MergedAnnotations #28208
    • Introduce predicate for searching enclosing classes in MergedAnnotations #28207
    • Remove obsolete org.springframework.core.NestedIOException #28198
    • Enable access to an RFC 7807 ProblemDetail formatted error response from the client side #28190
    • Support "application/problem+json" as the response Content-Type #28189
    • Introduce RuntimeHintsRegistrar #28160
    • Ability to differentiate different causes for WebInputException #28142
    • Remove TYPE_HIERARCHY_AND_ENCLOSING_CLASSES search strategy for MergedAnnotations #28080
    • Deprecate SerializationUtils#deserialize #28075
    • MediaType parameters in the "consumes" condition of @RequestMapping are not considered for matching #28024
    • Introduce token-based consumption of multipart requests in WebFlux #28006
    • Automatically clean up multipart temp files #27633
    • Introduce removeApplicationListener in ConfigurableApplicationContext #14023

    :lady_beetle: Bug Fixes

    • Use Arrays.toString for initMethodNames and destroyMethodNames arrays in AbstractBeanDefinition#toString #28427
    • Reflection configuration for primitives have wrong name #28347
    • GraalVM reflect config uses wrong format for inner classes #28312
    • Throw a meaningful exception if a TypeReference does not use a fully qualified name #28213
    • Fix queriedMethods handling in ReflectionHintsSerializer #28212
    • AntPathMatcher matches path with trailing slash differently if '**' is present in the pattern #27506

    :notebook_with_decorative_cover: Documentation

    • Use "instanceof pattern matching" in sample in reference docs #28332
    • Add Javadoc since for BeanDefinitionValueResolver.resolveInnerBean() #28217

    :hammer: Dependency Upgrades

    • Upgrade to Kotlin 1.6.20 #28036
    • Upgrade to Reactor 2022.0.0-M2 #28365

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.20(May 11, 2022)

    :star: New Features

    • Refine CachedIntrospectionResults property introspection #28445
    • Improve tests and Javadoc on binding to a property of type javax.servlet.Part #27830
    • WritableResource doesn't have parity with Resource in @Value etc. [SPR-10656] #15284

    :lady_beetle: Bug Fixes

    • Ignore invalid STOMP frame #28443
    • @ModelAttribute name attribute is not supported in WebFlux #28423
    • Fix BindingResult error when ModelAttribute has custom name in WebFlux #28422
    • Request body deserialization failures are not captured by exception handlers in WebFlux #28155

    :notebook_with_decorative_cover: Documentation

    • Remove Log4J initialization from package-info.java in spring-web #28420
    • Remove Log4J configurer from package-info.java in spring-core #28411
    • Fix github issue reference in RequestMappingHandlerMapping #28372
    • Add Javadoc since tags for GraphQL constants #28369
    • Fix method reference in Kotlin documentation #28340

    :hammer: Dependency Upgrades

    • Upgrade to ASM 9.3 #28390
    • Upgrade to Reactor 2020.0.19 #28437

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.22.RELEASE(May 11, 2022)

  • v5.3.19(Apr 13, 2022)

    :star: New Features

    • Remove DNS lookups during websocket connection initiation #28280
    • Add application/graphql+json Media type and MIME type constants #28271
    • Fix debug log for no matching acceptableTypes #28116
    • Provide support for post-processing a LocalValidatorFactoryBean's validator Configuration without requiring sub-classing #27956

    :lady_beetle: Bug Fixes

    • Improve documentation and matching algorithm in data binders #28333
    • NotWritablePropertyException when attempting to declaratively configure ClassLoader properties #28269
    • BeanPropertyRowMapper's support for direct column name matches is missing in DataClassRowMapper #28243
    • AbstractListenerReadPublisher does not call ServletOutputStream::isReady() when reading chunked data across network packets #28241
    • ResponseEntity objects are accumulated in ConcurrentReferenceHashMap #28232
    • Lambda proxy generation fix causes BeanNotOfRequiredTypeException #28209
    • CodeGenerationException thrown when using AnnotationMBeanExporter on JDK 17 #28138

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2020.0.18 #28329

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.21.RELEASE(Apr 13, 2022)

    :star: New Features

    • Remove DNS lookups during websocket connection initiation #28281

    :lady_beetle: Bug Fixes

    • Improve documentation and matching algorithm in data binders #28334
    • CodeGenerationException thrown when using AnnotationMBeanExporter on JDK 17 #28279
    • ResponseEntity objects are accumulated in ConcurrentReferenceHashMap #28273
    • NotWritablePropertyException when attempting to declaratively configure ClassLoader properties #28272
    Source code(tar.gz)
    Source code(zip)
  • v5.3.18(Mar 31, 2022)

    :star: New Features

    • Restrict access to property paths on Class references #28261
    • Introduce cancel(boolean mayInterruptIfRunning) in ScheduledTask #28233

    :lady_beetle: Bug Fixes

    • Move off deprecated API in SessionTransactionData #28234

    :notebook_with_decorative_cover: Documentation

    • Introduce warnings in documentation of SerializationUtils #28246
    • Update copyright date in reference manual #28237
    • @Transactional test does not execute all JPA lifecycle callback methods #28228

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.20.RELEASE(Mar 31, 2022)

  • v6.0.0-M3(Mar 17, 2022)

    :star: New Features

    • Add types to represent RFC 7807 problem details and exceptions #28187
    • Update AOT processing to account for multiple init or destroy methods #28151
    • Introduce ApplicationContextAotGenerator #28150
    • Add GeneratedType infrastructure #28149
    • Add support for contributing runtime hints for generated code #28148
    • Replace KotlinBodySpec with proper ResponseSpec extensions #28144
    • Add GraalVM native JSON configuration generation #28131
    • Support for compiling and running generated code in tests #28120
    • Support for ImportAware in AOT-processed contexts #28111
    • Support type-safe transaction rollback rules #28098
    • Rationalise merged BeanDefinition resolution for inner beans #28093
    • Add API to contribute to the setup of an ApplicationContext #28088
    • Deprecate "enclosing classes" search strategy for MergedAnnotations #28079
    • Add support for refreshing an ApplicationContext for AOT processing #28065
    • Upgrade client support to R2DBC 0.9 #28059
    • Improve SpringFactories to customize how arguments and instantiation failures are handled #28057
    • Remove deprecated SocketUtils #28054
    • Add Bean instantiation generator infrastructure #28047
    • Add code contribution infrastructure #28030
    • Add core JavaPoet utilities #28028
    • Add support for registering multiple init & destroy method names #28013
    • HibernateJpaDialect compatibility with Hibernate 6 (read-only transactions etc) #28007
    • MissingServletRequestPartException extends ServletRequestBindingException #27948
    • Implement an AOT equivalent of AutowiredAnnotationBeanPostProcessor #27921
    • Add a way to register the need for runtime reflection, resources, proxying, and serialization on components #27829
    • Provide repackaged version of JavaPoet #27828
    • Allow @Async qualifier to be declared with a placeholder or SpEL expression #27818
    • Prevent @Bean method overloading by default (avoiding accidental overloading and condition mismatches) #22609

    :lady_beetle: Bug Fixes

    • WebSocketConfigurationSupport.DefaultSockJsSchedulerContainer is private and exposed as a Bean #28146
    • Inconsistent overriding (and enforcement of non-overriding) between bean definition names and aliases #27866

    :hammer: Dependency Upgrades

    • Upgrade Kotlin to 1.6.20-RC #28147
    • Upgrade to AspectJ 1.9.8 GA #27416
    • Upgrade to Groovy 4.0 #27985

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.17(Mar 17, 2022)

    :star: New Features

    • Using DataClassRowMapper causes "No property found for column" debug messages in logs #28179
    • Improve diagnostics in SpEL for large array creation #28145
    • Support custom HTTP status in client-side REST testing support #28105
    • AsyncRestTemplate logging too verbose #28049

    :lady_beetle: Bug Fixes

    • java.lang.NoClassDefFoundError: org/springframework/cglib/beans/BeanMapEmitter #28110
    • CronExpression fails to calculate properly next execution when running on the day of winter daylight saving time #28095
    • Private init/destroy method may be invoked twice #28083
    • MappingJacksonValue and Jackson2CodecSupport#registerObjectMappersForType do not work together #28045
    • SpEL fails to recover from error during MIXED mode compilation #28043
    • When returning a ResponseEntity with a Flux while the function is suspended, it fails to encode the body #27809

    :notebook_with_decorative_cover: Documentation

    • Improve documentation for @EnabledIf and @DisabledIf test support #28157
    • Links to Spring Security are broken in the reference guide #28135
    • Document that transaction rollback rules may result in unintentional matches #28125
    • Improve documentation for TestContext events #27757
    • Clarify behavior for generics support in BeanUtils.copyProperties #27259

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2020.0.17 #28064

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.16(Feb 17, 2022)

    :star: New Features

    • Deprecate SocketUtils #28052
    • Add convenience factory method for ManagedList, ManagedSet and ManagedMap #28026
    • Synthesized annotation toString() doesn't match non-synthesized annotation on Java 9+ #28015
    • Add support for strict JSON comparison in WebTestClient #27993
    • Improve log message when searching for default executor for async processing #27983
    • Inconsistent behaviour in spring-orm between EntityManagerFactoryUtils.closeEntityManager() and SessionFactoryUtils.closeSession() #27972
    • Spring AOP cannot generate proxy for lambda on Java 16+ #27971
    • RestTemplate reading Json prohibits JDK HttpClient connection reuse (keep-alive) #27969
    • Deprecate AsyncTaskExecutor.execute(Runnable task, long startTimeout) #27959
    • Add CacheErrorHandler implementation that logs exceptions rather than rethrowing them #27826
    • Support for CGLIB BeanMap utility on JDK 17 #27802
    • Avoid message listener recovery in case of persistence exceptions from external transaction manager #1807

    :lady_beetle: Bug Fixes

    • Fix CronExpression fails to calculate next execution on the day of daylight saving time #28044
    • CronExpression fails to calculate next execution on the day of daylight saving time #28038
    • Using recursive annotations in Kotlin causes stack overflow #28012
    • Add formatting for SockJS close GoAway frame to prevent infinite loop for xhr-polling and xhr-streaming transport #28000
    • Reflective method invocation does not detect interface method when interface is declared in a subclass (e.g. HashMap.HashIterator.hasNext) #27995
    • ReflectionUtils.USER_DECLARED_METHODS does not filter methods declared in java.lang.Object #27970
    • CronExpression doesn't handle Quartz weekday of month expressions correctly #27966
    • ServletServerHttpRequest getHeaders() throws IllegalArgumentException instead of ignoring invalid content type / #27957
    • PropertySourcesPlaceholderConfigurer ignores ignoreUnresolvablePlaceholders flag #27947
    • Fix regression in BeanPropertyRowMapper regarding underscore name #27941
    • WebClient corrupts binary data when trying to upload many files #27939
    • Spring fails to determine XML is XSD-based if DOCTYPE appears in a comment #27915
    • ResourceHttpRequestHandler with PathPatternParser cannot resolve resources with a jsessionid URL #27913

    :notebook_with_decorative_cover: Documentation

    • Improve documentation for uri(URI) method in WebTestClient regarding base URI #28058
    • Polish reference docs (core) #28004
    • Fix ServletUriComponentsBuilder examples in ref docs #27984
    • Improve documentation for implementing AspectJ around advice #27980
    • Fix CaffeineCacheManager configuration in the documentation #27967
    • Fix Javadoc links to JSR 305 annotations #27904
    • Document how to register annotated classes with a GenericWebApplicationContext #27778

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2020.0.16 #28039

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-M2(Jan 13, 2022)

    :star: New Features

    • Stop defining a TaskScheduler bean in WebSocketConfigurationSupport #27903
    • Remove unnecessary check in isBridgedCandidateFor() #27862

    :lady_beetle: Bug Fixes

    • StrictHttpFirewall rejects request when HtmlUnit WebClient is called with encoded URL #27837

    :notebook_with_decorative_cover: Documentation

    • Fix typo and use of componentry #27852

    :hammer: Dependency Upgrades

    • Upgrade to Kotlin Coroutines 1.6.0 #27878
    • Upgrade to Kotlin serialization 1.3.2 #27879

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.15(Jan 13, 2022)

    :star: New Features

    • PrintingResultHandler in MockMvc should infer UTF-8 encoding for JSON response #27926
    • WebFlux request id should not contain internal IPs #27885
    • Deprecate inappropriate getBeanFactory() method in AbstractBeanDefinitionReader #27875
    • Make H2SequenceMaxValueIncrementer compatible with H2 database 2.0.x #27870
    • Improve error message in ResolvableType.forClassWithGenerics() #27847
    • Use of RequestPart with String leads to a file descriptor leak #27773
    • Expose headers from native client request after request is committed #27768

    :lady_beetle: Bug Fixes

    • Cannot read server-sent events without data (a.k.a. heartbeats) #27923
    • ArrayIndexOutOfBoundsException with STOMP and Jetty 10 #27899
    • ServerHttpResponseDecorator does not delegate methods for raw status code #27889
    • Clear cache when clearing argument resolvers #27888
    • Duplicated content-type response header on error response #27887

    :notebook_with_decorative_cover: Documentation

    • Fix syntax in WebFlux Validation example #27907
    • Add Section on Authorization to STOMP WebSocket documentation #27906
    • Correct not compiling example code in Data Access docs #27886

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2020.0.15 #27897

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-M1(Dec 16, 2021)

    See also the upgrade instructions.

    :star: New Features

    • Deprecate CachingConfigurerSupport and AsyncConfigurerSupport #27813
    • Deprecate StringUtils::trimWhitespace #27769
    • Enforce Future or void return declaration for each asynchronously executed method (e.g. with class-level @Async) #27734
    • Avoid unescape when CONNECT and CONNECTED frames #27722
    • Support SQUARE brackets [] around NAMED parameter #27716
    • Change StringUtils trimWhitespace to String.strip() #27703
    • Retrieve MethodMetadata for all user-declared methods in the order of declaration #27701
    • Refactor HttpMethod from enum to class #27697
    • Use parseInt without substring method #27680
    • Consistently replace String encoding names with StandardCharset arguments #27664
    • Use 'toString(Charset)' instead of 'toString(String)' for encodings #27646
    • Add method to ClientResponse that returns Mono terminating with createException #27637
    • Create immutable MultiValueMap wrapper #27608
    • Revisit MediaType ordering #27580
    • Optimize header removal in ForwardedHeaderFilter #27466
    • Change default driver in XStreamMarshaller from XppDriver to DomDriver #27464
    • Retain support for legacy JSR-250 javax.annotation.PostConstruct/PreDestroy and JSR-330 javax.inject.Inject in addition to Jakarta EE 9 annotations #27444
    • change string http header to enum #27356
    • Allow BeanUtils#instantiateClass inlining with native #27072
    • Remove support for deprecated Java SecurityManager #26901
    • CommonAnnotationBeanPostProcessor jakarta.annotation-api:2.0.0 support (@PostConstruct/Predestroy) #26185
    • @Transactional does not work on package protected methods of CGLib proxies #25582
    • Add support for explicit generic type in PayloadApplicationEvent #24599
    • Add Kotlin extensions for Cache and CacheManager #23927
    • JDK 11 HttpClient integration with WebClient #23432
    • @RequestMapping without @Controller registered as handler [SPR-17622] #22154
    • Upgrade Spring Context Support to Jakarta EE's com.sun.mail:jakarta.mail and com.sun.activation:jakarta.activation [SPR-17561] #22093
    • Enable support for custom vnd types in messaging MappingJackson2MessageConverter [SPR-15712] #20269
    • Add support for instant in @DateTimeFormat #19846
    • Support YearMonth and MonthDay with the @DateTimeFormat annotation #1215

    :notebook_with_decorative_cover: Documentation

    • Update javadoc and reference docs for consistent version and package references to the Jakarta EE 9 APIs #27689
    • Use default stylesheet for generated Javadoc HTML #27496

    :hammer: Dependency Upgrades

    • Support for Jakarta EE 9 (annotations and interfaces in jakarta.* namespace) #25354
    • Support for Jetty 11 #27424
    • Upgrade to AspectJ 1.9.8 for official Java 17 support #27537
    • Upgrade to Kotlin 1.6.10 #27413

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.14(Dec 16, 2021)

    :star: New Features

    • Add default methods to CachingConfigurer #27811
    • Provide a variant of ListableBeanFactory.findAnnotationOnBean(String, Class) that does not initialize factory beans #27796
    • Convert single null argument to Optional.empty() in SpEL varargs expression #27795
    • Declare serialVersionUID on DefaultAopProxyFactory #27784
    • The ReactorClientHttpConnector must apply mapper before tcpConfiguration() #27749
    • Add getter for RequestMappingInfo builder config #27723
    • Give warning when using capturing patterns with the AntPathMatcher #27688
    • Support for customization of 404 response when RouterFunctionWebHandler finds no routes #25358
    • ModelAndView.status does not work with RedirectView #25092
    • ThreadPoolExecutorFactoryBean add ability to prestart threads #1246
    • Support empty attributes in TagWriter #910

    :lady_beetle: Bug Fixes

    • AsyncConfigurer implementations are loaded too early #27808
    • Possible NPE in Spring MVC LogFormatUtils #27782
    • Extending CachingConfigurerSupport results in at least one log message about not being eligible for full post-processing #27751
    • WebFlux ServerResponse does not overwrite already present response headers #27741
    • Passing single null value in varargs SpEL expression results in NullPointerException #27719
    • UriUtils::extractFileExtension does not properly handle empty file names #27639
    • References of CountingBeforeAdvice target its previous location #22246
    • ProxyFactoryBean getObject called before setInterceptorNames, silently creating an invalid proxy [SPR-7582] #12238

    :notebook_with_decorative_cover: Documentation

    • Remove references to AsyncConfigurerSupport as AsyncConfigurer should be used instead #27812
    • Fix javadoc reference to ThrowsAdvice #27804
    • Suggested WebSocket config causes circular bean reference #27746
    • Document the difference in generics resolution between @Autowired and beanFactory.getBeanProvider #27727
    • Clarify that interface-level cache annotations work for target-class proxies as well #27726
    • SchedulerFactoryBean no longer sets the job store's DataSource when the job store class has been customized #27709
    • Fix typo #27699
    • Fix incorrect example of error handling in WebClient Javadoc #27645
    • Missing reference documentation for WebSocketScope #25172
    • Clarify behaviour of AnnotationBeanNameGenerator with acronyms #2030
    • Fix simple data format in appendix #1025
    • Update StoredProcedure.java declareParameter method JavaDoc #1000
    • Document @Bean definitions via default methods #767
    • Improved DataBinder Javadoc for xxx*yyy pattern matching. #699

    :hammer: Dependency Upgrades

    • Upgrade to ASM 9.3 (for early Java 19 support) #27740
    • Upgrade to JUnit 5.8.2 #27744
    • Upgrade to Reactor 2020.0.14 #27793

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.19.RELEASE(Dec 16, 2021)

    :star: New Features

    • Declare serialVersionUID on DefaultAopProxyFactory #27785
    • Use ByteArrayDecoder in DefaultClientResponse::createException #27667

    :lady_beetle: Bug Fixes

    • ProxyFactoryBean getObject called before setInterceptorNames, silently creating an invalid proxy [SPR-7582] #27817
    • Possible NPE in Spring MVC LogFormatUtils #27783
    • UndertowHeadersAdapter's remove() method violates Map contract #27593
    • Fix assertion failure messages in DefaultDataBuffer.checkIndex() #27577

    :notebook_with_decorative_cover: Documentation

    • Lazy annotation throws exception if non-required bean does not exist #27660
    • Incorrect Javadoc in [NamedParameter]JdbcOperations.queryForObject methods regarding exceptions #27581
    • DefaultResponseErrorHandler update javadoc comment #27571

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR25 #27635
    • Upgrade to Log4j2 2.16.0 #27825
    Source code(tar.gz)
    Source code(zip)
  • v5.3.13(Nov 11, 2021)

    :star: New Features

    • Use ByteArrayDecoder in DefaultClientResponse::createException #27666
    • Improve the efficiency of UrlPathHelper.getSanitizedPath() #27623
    • Add option to cleanup multipart temp files #27613
    • Add support for custom expression parsing in CachedExpressionEvaluator #27604
    • Use LocalDataSourceJobStore only if one is not specified via Quartz properties #27560
    • Introduce TypeFilterUtils for processing @ComponentScan.Filter #27553
    • Improve mapping function in ExtendedEntityManagerCreator.createProxy() #27456

    :lady_beetle: Bug Fixes

    • Static resources are missing when jar does not have a directory entry #27624
    • MultipartParser emits DataBufferLimitException about "Part headers exceeded the memory usage limit" unexpectedly #27612
    • UndertowHeadersAdapter's remove() method violates Map contract #27592
    • SpEL vararg method invocation fails if string literal contains a comma #27582

    :notebook_with_decorative_cover: Documentation

    • Fix grammar in webflux-webclient.adoc #27657
    • Lazy annotation throws exception if non-required bean does not exist #27649
    • Clarify LogFormatUtils limitLength vs replaceNewlines parameters #27632
    • PersistenceExceptionTranslationInterceptor attempting to instantiate prototype PersistenceExceptionTranslator beans #26412

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2020.0.13 #27636

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
Play Framework

Play Framework - The High Velocity Web Framework The Play Framework combines productivity and performance making it easy to build scalable web applica

Play Framework 12.3k Dec 29, 2022
:rocket: Lightning fast and elegant mvc framework for Java8

Based on Java8 + Netty4 to create a lightweight, high-performance, simple and elegant Web framework ?? Spend 1 hour to learn it to do something intere

Blade Framework 5.7k Dec 28, 2022
The Grails Web Application Framework

Build Status Slack Signup Slack Signup Grails Grails is a framework used to build web applications with the Groovy programming language. The core fram

grails 2.7k Jan 5, 2023
Ninja is a full stack web framework for Java. Rock solid, fast and super productive.

_______ .___ _______ ____. _____ \ \ | |\ \ | | / _ \ / | \| |/ | \ | |/ /_\ \ / | \

Ninja Web Framework 1.9k Jan 5, 2023
Vaadin 6, 7, 8 is a Java framework for modern Java web applications.

Vaadin Framework Vaadin allows you to build modern web apps efficiently in plain Java, without touching low level web technologies. This repository co

Vaadin 1.7k Jan 5, 2023
The modular web framework for Java and Kotlin

∞ do more, more easily Jooby is a modern, performant and easy to use web framework for Java and Kotlin built on top of your favorite web server. Java:

jooby 1.5k Dec 16, 2022
Apache Wicket - Component-based Java web framework

What is Apache Wicket? Apache Wicket is an open source, java, component based, web application framework. With proper mark-up/logic separation, a POJO

The Apache Software Foundation 657 Dec 31, 2022
Micro Java Web Framework

Micro Java Web Framework It's an open source (Apache License) micro web framework in Java, with minimal dependencies and a quick learning curve. The g

Pippo 769 Dec 19, 2022
True Object-Oriented Java Web Framework

Project architect: @paulodamaso Takes is a true object-oriented and immutable Java8 web development framework. Its key benefits, comparing to all othe

Yegor Bugayenko 748 Dec 23, 2022
ZK is a highly productive Java framework for building amazing enterprise web and mobile applications

ZK ZK is a highly productive Java framework for building amazing enterprise web and mobile applications. Resources Documentation Tutorial ZK Essential

ZK 375 Dec 23, 2022
Firefly is an asynchronous web framework for rapid development of high-performance web application.

What is Firefly? Firefly framework is an asynchronous Java web framework. It helps you create a web application Easy and Quickly. It provides asynchro

Alvin Qiu 289 Dec 18, 2022
An Intuitive, Lightweight, High Performance Full Stack Java Web Framework.

mangoo I/O mangoo I/O is a Modern, Intuitive, Lightweight, High Performance Full Stack Java Web Framework. It is a classic MVC-Framework. The foundati

Sven Kubiak 52 Oct 31, 2022
jetbrick web mvc framework

jetbrick-webmvc Web MVC framework for jetbrick. Documentation http://subchen.github.io/jetbrick-webmvc/ Dependency <dependency> <groupId>com.githu

Guoqiang Chen 25 Nov 15, 2022
A simple expressive web framework for java. Spark has a kotlin DSL https://github.com/perwendel/spark-kotlin

Spark - a tiny web framework for Java 8 Spark 2.9.3 is out!! Changeset <dependency> <groupId>com.sparkjava</groupId> <artifactId>spark-core</a

Per Wendel 9.4k Dec 29, 2022
:rocket: Lightning fast and elegant mvc framework for Java8

Based on Java8 + Netty4 to create a lightweight, high-performance, simple and elegant Web framework ?? Spend 1 hour to learn it to do something intere

Blade Framework 5.7k Jan 5, 2023
Realtime Client Server Framework for the JVM, supporting WebSockets with Cross-Browser Fallbacks

Welcome to Atmosphere: The Event Driven Framework supporting WebSocket and HTTP The Atmosphere Framework contains client and server side components fo

Atmosphere Framework 3.6k Jan 3, 2023
A web MVC action-based framework, on top of CDI, for fast and maintainable Java development.

A web MVC action-based framework, on top of CDI, for fast and maintainable Java development. Downloading For a quick start, you can use this snippet i

Caelum 347 Nov 15, 2022
CUBA Platform is a high level framework for enterprise applications development

Java RAD framework for enterprise web applications Website | Online Demo | Documentation | Guides | Forum CUBA Platform is a high level framework for

CUBA Platform 1.3k Jan 1, 2023
Flutter GetX模板代码生成 Gradle模式开发---Used to generate the template code of GetX framework

getx_template 语言: English | 中文简体 GetX usage Gold digging: Flutter GetX use --- simple charm! Renderings Plug-in effect Take a look at the effect diagr

小呆呆666 241 Dec 23, 2022