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.

Issues
  • 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.[email protected]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: [email protected]
    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 55
  • 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 [email protected]
              at [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
              -  waiting on [email protected]
              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
  • AnnotationDrivenStaticEntityMockingControl in spring-aspects module require javax.persistence.Entity on compiler classpath  [SPR-6819]

    AnnotationDrivenStaticEntityMockingControl in spring-aspects module require javax.persistence.Entity on compiler classpath [SPR-6819]

    Pavel Král opened SPR-6819 and commented

    Aspect org.springframework.mock.staticmock.AnnotationDrivenStaticEntityMockingControl require for ajc javax.persistence.Entity to be on classpath, hovewer spring-aspect pom.xml doesn't provide such dependency. As workaround one must declare dependency in affected module pom.xml

    <dependency>
      <groupId>javax.persistence</groupId>
      <artifactId>persistence-api</artifactId>
      <version>1.0</version>
      <scope>provided</scope>
    </dependency>
    

    Affects: 3.0 GA

    Attachments:

    Issue Links:

    • #16777 JCache dependency in spring-aspects
    • #11943 Spring aspects depends on javax.persistence/persistence-api 1.0. Conflicts with ROO including hibernate-jpa-2.0-api

    Referenced from: commits https://github.com/spring-projects/spring-framework/commit/bd88bbab4a929dd07d4e29a08ba3d27749b8ec36, https://github.com/spring-projects/spring-framework/commit/4ddcd35d133d5274b8698f6f1758f6892ef487e2, https://github.com/spring-projects/spring-framework/commit/353781021d135f33cc727cf43c20bbb126871dda, https://github.com/spring-projects/spring-framework/commit/99c5a70ce3a3e7c4b0c36c70bdf37013be4e67ed, https://github.com/spring-projects/spring-framework/commit/82ec515e598caa971b92cdc4f86c8f894705deb7, https://github.com/spring-projects/spring-framework/commit/d9df50c6cd4c5b126b621dd932f1a0611baf4b7b, https://github.com/spring-projects/spring-framework/commit/94292cad1ceb3c541f5ab3906758fe2c67cfd144, https://github.com/spring-projects/spring-framework/commit/6e516b7281e92e3ae00343437ce5d16ebc9bacf5

    7 votes, 19 watchers

    type: bug in: core 
    opened by spring-projects-issues 41
  • JpaTransactionManager datasource is not thread safe

    JpaTransactionManager datasource is not thread safe

    If JpaTransactionManager is used in a multitenant setup then the dataSource is not thread safe. This is in contrast to the TransactionSynchronizationMangager which uses ThreadLocals to manage its fields.

    status: waiting-for-triage 
    opened by bwilsonPaychex 2
  • Upgrade to AspectJ 1.9.8

    Upgrade to AspectJ 1.9.8

    This is the first version that officially supports JDK17 source and target compatibility level (see eclipse/org.aspectj#79).

    Right now, we've downgraded the language level to 1.8 in aspectj Gradle tasks. Closing this issue would involve reverting the changes to the compileAspectj and compileTestAspectj tasks in spring-aspects.gradle.

    type: dependency-upgrade 
    opened by bclozel 0
  • Add HTTP response status to request logging.

    Add HTTP response status to request logging.

    null

    status: waiting-for-triage 
    opened by selalerercapitolis 0
  • Upgrade to Kotlin 1.6

    Upgrade to Kotlin 1.6

    As seen in #27409, this change also implies switching to a JDK17 baseline for compiling Kotlin code.

    type: dependency-upgrade 
    opened by bclozel 0
  • `StringUtils.collectionToDelimitedString(…)` fails with `NullPointerException` when the collection contains `null`

    `StringUtils.collectionToDelimitedString(…)` fails with `NullPointerException` when the collection contains `null`

    Affects: 5.3.10

    After #26316, StringUtils.collectionToDelimitedString(…) behaves slightly different than the previous implementation in 5.3.9.

    Calling StringUtils.collectionToDelimitedString(Collections.singleton(null), ",") in version 5.3.10 fails with:

    java.lang.NullPointerException
    	at org.springframework.util.StringUtils.collectionToDelimitedString(StringUtils.java:1304)
    	at org.springframework.util.StringUtils.collectionToDelimitedString(StringUtils.java:1326)
    

    whereas version 5.3.9 returned the string "null".

    This ticket is to clarify which behavior is the correct one.

    See also spring-projects/spring-data-redis#2167

    type: regression in: core 
    opened by mp911de 0
  • ProtobufMessageConverter fails to parse JSON payload if byte array is used

    ProtobufMessageConverter fails to parse JSON payload if byte array is used

    Affects: org.springframework:spring-messaging:5.3.6


    We are using org.springframework:spring-messaging:5.3.6 with com.google.protobuf:protobuf-java:3.13.0 and com.google.protobuf:protobuf-java-util:3.13.0 to send and receive protobuf messages as application/json.

    static class ProtobufJavaUtilSupport implements ProtobufFormatSupport {
    ...
    @Override
    public void merge(org.springframework.messaging.Message<?> message, Charset charset,
    		MimeType contentType, ExtensionRegistry extensionRegistry, Message.Builder builder)
    		throws IOException, MessageConversionException {
    
    	if (contentType.isCompatibleWith(APPLICATION_JSON)) {
    		this.parser.merge(message.getPayload().toString(), builder);
    	}
    	else {
    		throw new MessageConversionException(
    				"protobuf-java-util does not support parsing " + contentType);
    	}
    }
    ...
    }
    

    message.getPayload() returns a byte array (GenericMessage [payload=byte[230], headers={...}]). Calling toString on a byte array produces a string similar to "[[email protected]".

    Attempt to parse resulting string as JSON produces the following error:

    com.google.protobuf.InvalidProtocolBufferException: java.io.EOFException: End of input at line 1 column 12 path $[1]
    at com.google.protobuf.util.JsonFormat$ParserImpl.merge (JsonFormat.java:1347)
    at com.google.protobuf.util.JsonFormat$Parser.merge (JsonFormat.java:477)
    at org.springframework.messaging.converter.ProtobufMessageConverter$ProtobufJavaUtilSupport.merge (ProtobufMessageConverter.java:265)
    at org.springframework.messaging.converter.ProtobufMessageConverter.convertFromInternal (ProtobufMessageConverter.java:150)
    

    I assume that byte arrays need special handling so that we use String constructor instead of toString() call in order to get actual JSON content (i.e. something akin to new String(message.getPayload(), StandardCharsets.UTF_8)).

    status: waiting-for-triage 
    opened by white-sagittarius 0
  • Revise Eclipse IDE support

    Revise Eclipse IDE support

    Overview

    After the upgrade to Gradle 7.2 (#26870), I noticed that we can likely greatly simplify our custom Gradle configuration for Eclipse IDE.

    Example Warnings

    > Task :spring-core:eclipseSettings
    Execution optimizations have been disabled for task ':spring-core:eclipseSettings' to ensure correctness due to the following reasons:
    
      - Gradle detected a problem with the following location: '/spring-framework/spring-core/.settings'. Reason: Task ':spring-core:eclipseJdt' uses this output of task ':spring-core:eclipseSettings' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. Please refer to https://docs.gradle.org/7.2/userguide/validation_problems.html#implicit_dependency for more details about this problem.
    Gradle detected a problem with the following location: '/spring-framework/spring-core/.settings'. Reason: Task ':spring-core:eclipseJdt' uses this output of task ':spring-core:eclipseSettings' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. Please refer to https://docs.gradle.org/7.2/userguide/validation_problems.html#implicit_dependency for more details about this problem. This behaviour has been deprecated and is scheduled to be removed in Gradle 8.0. Execution optimizations are disabled to ensure correctness. See https://docs.gradle.org/7.2/userguide/more_about_tasks.html#sec:up_to_date_checks for more details.
    
    > Task :spring-core:eclipseWstComponentSettings
    Execution optimizations have been disabled for task ':spring-core:eclipseWstComponentSettings' to ensure correctness due to the following reasons:
    
      - Gradle detected a problem with the following location: '/spring-framework/spring-core/.settings'. Reason: Task ':spring-core:eclipseJdt' uses this output of task ':spring-core:eclipseWstComponentSettings' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. Please refer to https://docs.gradle.org/7.2/userguide/validation_problems.html#implicit_dependency for more details about this problem.
    Gradle detected a problem with the following location: '/spring-framework/spring-core/.settings'. Reason: Task ':spring-core:eclipseJdt' uses this output of task ':spring-core:eclipseWstComponentSettings' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. Please refer to https://docs.gradle.org/7.2/userguide/validation_problems.html#implicit_dependency for more details about this problem. This behaviour has been deprecated and is scheduled to be removed in Gradle 8.0. Execution optimizations are disabled to ensure correctness. See https://docs.gradle.org/7.2/userguide/more_about_tasks.html#sec:up_to_date_checks for more details.
    
    Execution optimizations have been disabled for 2 invalid unit(s) of work during this build to ensure correctness.
    Please consult deprecation warnings for more details.
    

    Deliverables

    • [ ] Fix deprecation warnings in the build for the eclipse Gradle task.
    • [ ] Simplify ide.gradle -- for example, by removing support for Eclipse web tools which we no longer need.
    type: task 
    opened by sbrannen 0
  • Migrate to TestNG Engine for the JUnit Platform

    Migrate to TestNG Engine for the JUnit Platform

    To simplify our Gradle build in the spring-test module, we should investigate migrating to the TestNG Engine for the JUnit Platform and consolidate all tests into a single Gradle test task.

    in: test type: task status: blocked 
    opened by sbrannen 1
  • DefaultStompSession doesn't fully support @SubscribeMapping

    DefaultStompSession doesn't fully support @SubscribeMapping

    Currently DefaultStompSession just support the subscription for message broker, the subscribe message is sent without payload and the subscription object is kept in DefaultStompSession all the time until unsubscribe it. Obviously it's not suitable for application subscription (A controller method is annotated with @SubscribeMapping).

    status: waiting-for-triage 
    opened by yfei-z 0
  • Error from CompletableFuture not handled correctly in MockMvc test

    Error from CompletableFuture not handled correctly in MockMvc test

    Affects: Spring Boot 2.5.4 / Spring Framework 5.3.9

    I recently ran into an issue testing an endpoint of an application using CompletableFutures as a return type. I reproduced it using a minimal application based on the demo project from the Spring Boot Initializer which consists of these two classes:

    @SpringBootApplication
    public class DemoApplication {
    	public static void main(String[] args) {
    		SpringApplication.run(DemoApplication.class, args);
    	}
    }
    
    @RestController
    public class TestController {
        @GetMapping("/test")
        CompletableFuture<String> test() {
            return CompletableFuture.failedFuture(new RuntimeException("Error"));
        }
    }
    

    If I start the application and make a GET call to the endpoint, I receive an internal server error as I would expect:

    $ curl -i http://localhost:8080/test                                                                                                                                               
    HTTP/1.1 500                                                                                                                                                                                                      
    Content-Type: application/json                                                                                                                                                                                    
    Transfer-Encoding: chunked                                                                                                                                                                                        
    Date: Wed, 15 Sep 2021 07:15:37 GMT                                                                                                                                                                               
    Connection: close
    
    {"timestamp":"2021-09-15T07:15:37.497+00:00","status":500,"error":"Internal Server Error","path":"/test"}
    

    Then I wrote a simple WebMvcTest to verify the behaviour:

    @AutoConfigureMockMvc
    @WebMvcTest(controllers = TestController.class)
    class TestControllerTest {
        @Autowired
        private MockMvc mockMvc;
    
        @Test
        void test() throws Exception {
            mockMvc
              .perform(MockMvcRequestBuilders.get("/test"))
              .andDo(MockMvcResultHandlers.print())
              .andExpect(status().isInternalServerError());
        }
    }
    

    I would expect the test to pass since the exception thrown in the CompletableFuture should lead to an internal server error there as well, however the result is:

    MockHttpServletRequest:
          HTTP Method = GET
          Request URI = /test
           Parameters = {}
              Headers = []
                 Body = null
        Session Attrs = {}
    
    Handler:
                 Type = com.example.demo.TestController
               Method = com.example.demo.TestController#test()
    
    Async:
        Async started = true
         Async result = java.lang.RuntimeException: Error
    
    Resolved Exception:
                 Type = null
    
    ModelAndView:
            View name = null
                 View = null
                Model = null
    
    FlashMap:
           Attributes = null
    
    MockHttpServletResponse:
               Status = 200
        Error message = null
              Headers = []
         Content type = null
                 Body = 
        Forwarded URL = null
       Redirected URL = null
              Cookies = []
    
    MockHttpServletRequest:
          HTTP Method = GET
          Request URI = /test
           Parameters = {}
              Headers = []
                 Body = null
        Session Attrs = {}
    
    Handler:
                 Type = com.example.demo.TestController
               Method = com.example.demo.TestController#test()
    
    Async:
        Async started = true
         Async result = java.lang.RuntimeException: Error
    
    Resolved Exception:
                 Type = null
    
    ModelAndView:
            View name = null
                 View = null
                Model = null
    
    FlashMap:
           Attributes = null
    
    MockHttpServletResponse:
               Status = 200
        Error message = null
              Headers = []
         Content type = null
                 Body = 
        Forwarded URL = null
       Redirected URL = null
              Cookies = []
    
    java.lang.AssertionError: Status expected:<500> but was:<200>
    Expected :500
    Actual   :200
    

    So the http response is OK thought the controller returns a failed CompletableFuture.

    status: waiting-for-triage in: test 
    opened by hoshpak-next 1
Releases(v5.2.17.RELEASE)
  • v5.2.17.RELEASE(Sep 15, 2021)

    :star: New Features

    • Invalid JavaBean property 'logoutHandlers' being accessed (warning in the logs for Spring Security's ConcurrentSessionFilter) #27396
    • Convenient configuration of type permissions for XStream 1.4.18 #27344
    • ResponseStatusException.initCause always throws IllegalStateException #27212

    :lady_beetle: Bug Fixes

    • Support char, float, and double primitive default values in BeanUtils.instantiateClass() #27401
    • CommonsMultipartResolver and DEBUG logging lead to empty fileMap in MultipartHttpServletRequest #27398
    • Fix UrlPathHelper#shouldRemoveSemicolonContent() #27310
    • CompositeUriComponentsContributor#hasContributors: method name is not compliant with its intention #27275
    • WebSocketMessageBrokerStats.getExecutorStatsInfo() throws exception if Executor is not a ThreadPoolExecutor #27213

    :notebook_with_decorative_cover: Documentation

    • Fix Kotlin example for filtering handler functions #27352
    • Document when prepareTestInstance() is invoked when using the SpringMethodRule #27312

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR23 #27378
    Source code(tar.gz)
    Source code(zip)
  • v5.3.10(Sep 15, 2021)

    :star: New Features

    • Invalid JavaBean property 'logoutHandlers' being accessed (warning in the logs for Spring Security's ConcurrentSessionFilter) #27372
    • Convenient configuration of type permissions for XStream 1.4.18 #27343
    • Add SmallRye Mutiny support to ReactiveAdapterRegistry #27331
    • Introduce ExceptionCollector testing utility #27316
    • Support TimeUnit in the @Scheduled annotation #27309
    • Make it possible to determine if circular references are prohibited or if the cycle just couldn't be broken #27289
    • Support Charset for character encoding in MockMvc #27231
    • Support default character encoding for response in MockMvc #27230
    • Introduce setDefaultCharacterEncoding() in MockHttpServletResponse #27214
    • Use MessageSource for @ExceptionHandler methods #27203
    • ResponseStatusException.initCause always throws IllegalStateException #27196
    • Introduce soft assertions for WebTestClient #26969
    • Introduce soft assertions for MockMvc #26917
    • Blockhound flags a blocking call when WebFlux serves a static resource #26631
    • Optimize memory allocations in StringUtils#cleanPath #26316
    • InvocableHandlerMethod calls makeAccessible(getBridgedMethod()) on every call [SPR-15230] #19795

    :lady_beetle: Bug Fixes

    • Support char, float, and double primitive default values in BeanUtils.instantiateClass() #27390
    • Fix memory leak on AOP Proxy class definition cache #27375
    • Fix response body missing 1st byte inside UnknownContentTypeException #27374
    • CommonsMultipartResolver and DEBUG logging lead to empty fileMap in MultipartHttpServletRequest #27350
    • Fix UrlPathHelper#shouldRemoveSemicolonContent() #27303
    • CompositeUriComponentsContributor#hasContributors: method name is not compliant with its intention #27271
    • Error with formatMapping method in AbstractMethodMessageHandler.java #27247
    • Apply default ResultHandlers before default ResultMatchers in MockMvc #27225
    • MockHttpServletResponse.characterEncoding should not be @Nullable #27219
    • WebSocketMessageBrokerStats.getExecutorStatsInfo() throws exception if Executor is not a ThreadPoolExecutor #27209
    • HtmlUnitRequestBuilder ignores file uploaded via HtmlFileInput.setData() #27199

    :notebook_with_decorative_cover: Documentation

    • Fix wording in Javadoc of ClientResponse.mutate() #27389
    • Fix some typos and mistakes in docs #27388
    • Fix misplaced comma in AOP doc #27387
    • Fix Kotlin example for filtering handler functions #27337
    • Document when prepareTestInstance() is invoked when using the SpringMethodRule #27305
    • Fix duplicated "the" occurrences in Javadoc and XSD #27291
    • Fix typo in DefaultPartHttpMessageReader #27260
    • Fix reference to Optional.isPresent() in ObjectUtils.isEmpty() #27223
    • Clarify that ClientRequest.from(..) also copies body #27220
    • @Cacheable caches empty Optionals but documentation states otherwise #27184
    • Reference docs missing left-hand side navigation #27177

    :hammer: Dependency Upgrades

    • Compatibility with Jackson 2.13 #27206
    • Upgrade to JUnit 5.8 #27392
    • Upgrade to Kotlin 1.5.30 #27371
    • Upgrade to Reactor 2020.0.11 #27399

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.16.RELEASE(Jul 14, 2021)

    :star: New Features

    • BeanCreationException error message should always include declaring class of constructor (or factory method) #27140
    • SynchronossPartHttpMessageReader should only create temp directory when needed #27094
    • Deprecate internal APIs in ScriptUtils implementations #26948

    :beetle: Bug Fixes

    • AOP auto-proxying with proxyTargetClass=true and introduction advice does not work for JDK proxy targets #27148
    • SimpleMethodMetadataReadingVisitor.Source.toString() omits separator for method arguments #27096
    • DefaultPathSegment allows shared empty parameters map to be mutated #27065
    • Ignore comments when searching for SQL statement delimiter in ScriptUtils #26942
    • Ignore delimiter enclosed in double quotes in ScriptUtils #26936

    :notebook_with_decorative_cover: Documentation

    • Fix @Transactional examples regarding method visibility #27005
    • Improve @Transactional docs regarding method visibility #27004
    • Document transactional semantics for @TransactionalEventListener after completion methods #26979

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR21 #27163
    Source code(tar.gz)
    Source code(zip)
  • v5.3.9(Jul 14, 2021)

    :star: New Features

    • Configure CommonsMultipartResolver to support specific HTTP methods #27161
    • Allow BeanDefinitionBuilder to set an instance supplier with a ResolvableType #27160
    • Reason of @ResponseStatus on handler method is not resolved by MessageSource #27156
    • ResourceHandlerRegistry#getHandlerMapping should initialize handler once in outer loop #27153
    • Set synthetic flag using BeanDefinitionBuilder #27141
    • BeanCreationException error message should always include declaring class of constructor (or factory method) #27139
    • Improve Jetty 10 check in JettyClientHttpResponse #27136
    • Jetty10RequestUpgradeStrategy use an old jetty 9 class HandshakeRFC6455 #27121
    • ClassNotFoundException using Jetty 10 and its reactive client #27112
    • Use StringBuilder.append(char) where possible #27098
    • Consider "wss" and "https" for secure flag in Forwarded header checks #27097
    • SynchronossPartHttpMessageReader should only create temp directory when needed #27092
    • Implement equals, hashCode, & toString in BeanMethod and *Metadata types #27076
    • Remove logging dependency in BeanUtils #27070
    • Exclude sealed interfaces from auto-proxying (for JDK 17 compatibility) #27027
    • Blockhound error when running with transaction with a TransactionOperator #26955
    • Configure StandardServletMultipartResolver to only support multipart/form-data #26826
    • Add a way to set executeExistingDelayedTasksAfterShutdown from ThreadPoolTaskScheduler #26719
    • Apply dynamic changes in ThreadPoolTaskExecutor before setting local value #26700

    :beetle: Bug Fixes

    • JettyHttpHandlerAdapter is not aware of Server[Request|Response]Wrapper #27146
    • {*path} pattern (CaptureTheRestPathElement) includes undocumented leading slash in @PathVariable path #27132
    • NoSuchMethodError when invoke JettyWebSocketSession.getRemoteAddress in jetty 10 #27120
    • CronExpression is still broken on spring-context-5.3.8 #27117
    • SimpleMethodMetadataReadingVisitor.Source.toString() omits separator for method arguments #27095
    • DefaultPathSegment allows shared empty parameters map to be mutated #27064
    • AOP auto-proxying with proxyTargetClass=true and introduction advice does not work for JDK proxy targets #27044
    • ServletRequestDataBinder assumes Standard servlet multipart handling #26999
    • DataClassRowMapper should not override Kotlin init properties #26569

    :notebook_with_decorative_cover: Documentation

    • Add Javadoc @since to BeanDefinitionBuilder.setSynthetic() #27155
    • Fix link to Javadoc API #27151
    • Added description for HandlerInterceptor #27122
    • Fix typo in core-beans.adoc #27113
    • Fix typo in BeanDefinitionDsl.kt #27105
    • Improve docs for getContentAsByteArray method of ContentCachingRequestWrapper #27068
    • Fix explanation on default settings for content negotiation in reference doc #27067
    • Document that any @Valid* annotation triggers validation in the reference manual #27050
    • Improve RequestPartMethodArgumentResolver Javadoc #27043
    • Improve RequestResponseBodyMethodProcessor Javadoc #27042
    • Clarify that baseName in ResourceBundleMessageSource does not support multiple locations #27038
    • Link alternate documentation formats #27015

    :hammer: Dependency Upgrades

    • Compatibility with HtmlUnit 2.51 #27147
    • Upgrade to ASM 9.2 (for early Java 18 support) #27069
    • Upgrade to Kotlin 1.5.21 #27110
    • Upgrade to Kotlin Coroutines 1.5.1 #27157
    • Upgrade to Mockk 1.11.0 #27109
    • Upgrade to Reactor 2020.0.9 #27158

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.8(Jun 9, 2021)

    :star: New Features

    • HttpComponentsClientHttpConnector should close underlying resources #27032
    • Default value of StandaloneMockMvcBuilder.useSuffixPatternMatch differs from the same property in RequestMappingHandlerMapping #27030
    • Lookup method autowiring ignores method's generic info #26998
    • Set BEST_MATCHING_PATTERN_ATTRIBUTE on requests with WebMvc.fn #26963
    • Remove jackson-module-kotlin warning #26962
    • Switch back to parallel thread after WebSession id is generated #26958
    • Introduce ResponseEntity.internalServerError() #26952
    • Polish PORT_PATTERN in UriComponentsBuilder #26951
    • Deprecate/Remove internal APIs in ScriptUtils implementations #26947
    • Consider returning static DefaultApplicationStartup step #26939
    • Exception in Tomcat when SockJS top URL is a WebSocket upgrade #26933
    • Improve support for port numbers in allowedOriginPattern of CorsConfiguration #26927
    • Add ApplicationEvent constructor for specifying timestamp #26871
    • Add awaitExchangeOrNull extension function to reactive webclient #26778

    :beetle: Bug Fixes

    • Revisit fix for gh-26905 in UriComponentsBuilder #27039
    • MultipartHttpMessageWriter in WebClient doesn't use custom Jackson Encoder since 5.3.3 #27017
    • PartFile name lost when building a MultiPart #27007
    • No replacement of deprecated CronSequenceGenerator.isValidExpression #26996
    • NPE if StompEndpointRegistry has allowedOrigins with null #26987
    • CronExpression is broken on spring-context-5.3.6 #26964
    • FlightRecorderApplicationStartup is not thread safe #26941
    • Ignore delimiter enclosed in double quotes in ScriptUtils #26935
    • Ignore comments when searching for SQL statement delimiter in ScriptUtils #26911

    :notebook_with_decorative_cover: Documentation

    • spring-framework-main-code attribute has not been expanded in docs #27041
    • Document that class-level @ResponseStatus is inherited by @ExceptionHandler methods #27031
    • Improve @Transactional docs regarding method visibility #27003
    • Fix @Transactional examples regarding method visibility #27001
    • Fix typo in code example #26980
    • Document transactional semantics for @TransactionalEventListener after completion methods #26974
    • Fix typo #26973
    • Fix broken Javadoc tags #26967

    :hammer: Dependency Upgrades

    • Upgrade to ASM master #27023
    • Upgrade to Coroutines 1.5.0 #26897
    • Upgrade to JUnit 5.7.2 #26946
    • Upgrade to Kotlin 1.5.10 #27035

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.15.RELEASE(May 12, 2021)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :notebook_with_decorative_cover: Documentation

    • Remove leftover Javadoc from WebClient #26809

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR20 #26891
    Source code(tar.gz)
    Source code(zip)
  • v5.3.7(May 12, 2021)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :notebook_with_decorative_cover: Documentation

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

    :hammer: Dependency Upgrades

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

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.14.RELEASE(Apr 13, 2021)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR19 #26768
    Source code(tar.gz)
    Source code(zip)
  • v5.3.6(Apr 13, 2021)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :notebook_with_decorative_cover: Documentation

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

    :hammer: Dependency Upgrades

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

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.5(Mar 16, 2021)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :notebook_with_decorative_cover: Documentation

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

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2020.0.5 #26650

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.13.RELEASE(Feb 16, 2021)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :notebook_with_decorative_cover: Documentation

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

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR17 #26549
    Source code(tar.gz)
    Source code(zip)
  • v5.3.4(Feb 16, 2021)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :notebook_with_decorative_cover: Documentation

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

    :hammer: Dependency Upgrades

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

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.3(Jan 12, 2021)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :notebook_with_decorative_cover: Documentation

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

    :hammer: Dependency Upgrades

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

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v4.3.30.RELEASE(Dec 9, 2020)

    :star: New Features

    • ContentCachingResponseWrapper should not add “Content-Length” when “Transfer-Encoding” is present #26194
    • Inefficient request handling inside ServletRequestDataBinder #26007
    • Avoid creation of unused logger instance in AbstractMediaTypeExpression #25904

    :beetle: Bug Fixes

    • Remove duplicate "property" in PropertyCacheKey.toString() #26245
    • UrlPathHelper#removeJsessionid doesn't remove the jsessionid from the URL #26086
    • jsessionid breaks request mappings when removeSemicolonContent is turned off #25869

    :notebook_with_decorative_cover: Documentation

    • DateTimeFormat ISO.DATE_TIME javadoc contains misleading default note #26138
    Source code(tar.gz)
    Source code(zip)
  • v5.0.20.RELEASE(Dec 9, 2020)

    :star: New Features

    • ContentCachingResponseWrapper should not add “Content-Length” when “Transfer-Encoding” is present #26193
    • Inefficient request handling inside ServletRequestDataBinder #26006
    • Avoid creation of unused logger instance in AbstractMediaTypeExpression #25903

    :beetle: Bug Fixes

    • Remove duplicate "property" in PropertyCacheKey.toString() #26244
    • UrlPathHelper#removeJsessionid doesn't remove the jsessionid from the URL #26085
    • LinkedMultiValueMap downstream issue with MultiValueMapAdapter package private base class #25962
    • Wrong type inference in Kotlin while overriding RequestMappingHandlerMapping#getMappingForMethod #25873
    • ClassCastException when wiring bean using method injection (NullBean instead of 'null') #25870
    • jsessionid breaks request mappings when removeSemicolonContent is turned off #25868

    :notebook_with_decorative_cover: Documentation

    • DateTimeFormat ISO.DATE_TIME javadoc contains misleading default note #26137
    • Incorrect example in javadocs of Assert.notNull(object, messageSupplier) #25871
    Source code(tar.gz)
    Source code(zip)
  • v5.1.20.RELEASE(Dec 9, 2020)

    :star: New Features

    • ContentCachingResponseWrapper should not add “Content-Length” when “Transfer-Encoding” is present #26192
    • Wildcard is a valid Access-Control-Expose-Headers value #26116
    • EntityManagerFactory startup failure in deferred mode is only available on first use #26095
    • StompSubProtocolHandler logs failed authentication with error stack trace #26038
    • DefaultSimpUserRegistry prevents event from being published if original SimpMessageHeaderAccessor cannot be found #26015
    • Inefficient request handling inside ServletRequestDataBinder #26005

    :beetle: Bug Fixes

    • Remove duplicate "property" in PropertyCacheKey.toString() #26243
    • DataBuffer Leak in Server Response #26235
    • PathMatchingResourcePatternResolver fails to resolve resources from JAR located in path with '#' on JDK 11+ #26106
    • UrlPathHelper#removeJsessionid doesn't remove the jsessionid from the URL #26084
    • NamedParameterJdbcTemplate.batchUpdate does not individually apply the SQL type from each SqlParameterSource argument #26074
    • Order of profiles in tests is not preserved #26009

    :notebook_with_decorative_cover: Documentation

    • DateTimeFormat ISO.DATE_TIME javadoc contains misleading default note #26136

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Californium-SR23 #26233
    Source code(tar.gz)
    Source code(zip)
  • v5.2.12.RELEASE(Dec 9, 2020)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :notebook_with_decorative_cover: Documentation

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

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR15 #26175
    Source code(tar.gz)
    Source code(zip)
  • v5.3.2(Dec 9, 2020)

    :star: New Features

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

    :beetle: Bug Fixes

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

    :notebook_with_decorative_cover: Documentation

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

    :hammer: Dependency Upgrades

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

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.1(Nov 10, 2020)

    :star: New Features

    • Expose a public method "isClosed" to indicate whether the connection has been closed in WebSocketSession (WebFlux) #26043
    • WebFlux missing programmatic handling of MappingJacksonValue #26035
    • Optimize locking in AspectJProxyFactory for concurrent aspect instantiation #26034
    • Upgrade SpelCompiler bytecode level to 1.8 and optimize for concurrent access #26033
    • MergedAnnotationCollectors.toAnnotationSet() should not create intermediate ArrayList #26031
    • SpEL doesn't work nicely with records #26029
    • StompSubProtocolHandler logs failed authentication with error stack trace #26026
    • Expose toEntityFlux methods in WebClient.ResponseSpec #26023
    • Improve AdvisedSupport.getAdvisors() #26017
    • Improve URI/query strings sanitization #26012
    • DefaultSimpUserRegistry prevents event from being published if original SimpMessageHeaderAccessor cannot be found #26010
    • DefaultWebClientBuilder copies references #25992
    • Inefficient request handling inside ServletRequestDataBinder #25986
    • Avoid multiple volatile reads/writes in a row where only one is enough #25899
    • Allows Jackson2 encoders to log Throwable reason for not being able to serialize or deserialize #25892
    • Mechanism to access request bound objects in WebClient filter in servlet env #25710

    :beetle: Bug Fixes

    • Cannot be cast to class Publisher error with non suspending @Transactional functions #26052
    • Fix wrong reference in UrlPathHelper.removeSemicolonContentInternal() #26050
    • setTaskScheduler in StompBrokerRelayRegistration breaks chaining #26049
    • Add FullyQualifiedAnnotationBeanNameGenerator.INSTANCE #26025
    • Autowiring does not work reliably in case of dynamically changing prototype bean class #26019
    • Order of profiles in tests is not preserved #26004
    • @Transactional on suspending function returning a value always rollbacks #25998
    • SseEmitter: connection closed after first event #25987
    • @Nonnull annotation breaks ServletRequestMethodArgumentResolver for Principal #25981
    • Spring MVC's locale resolver can no longer be customized in parent context #25290

    :notebook_with_decorative_cover: Documentation

    • Fix kotlin example code which does not compile #26016
    • Fix a broken Asciidoctor syntax in core-resources.adoc #25999

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.11.RELEASE(Nov 10, 2020)

    :star: New Features

    • StompSubProtocolHandler logs failed authentication with error stack trace #26037
    • MergedAnnotationCollectors.toAnnotationSet() should not create intermediate ArrayList #26036
    • DefaultSimpUserRegistry prevents event from being published if original SimpMessageHeaderAccessor cannot be found #26013
    • DefaultWebClientBuilder copies references #25993
    • Inefficient request handling inside ServletRequestDataBinder #25990

    :beetle: Bug Fixes

    • Add FullyQualifiedAnnotationBeanNameGenerator.INSTANCE #26027
    • Autowiring does not work reliably in case of dynamically changing prototype bean class #26020
    • Order of profiles in tests is not preserved #26008
    • SseEmitter: connection closed after first event #25989

    :notebook_with_decorative_cover: Documentation

    • Fix a broken Asciidoctor syntax in core-resources.adoc #26000
    Source code(tar.gz)
    Source code(zip)
  • v5.3.0(Oct 27, 2020)

    :star: New Features

    • Allow cache eviction for ConcurrentLruCache #25963
    • Support Optional for query parameters in UriBuilder and UriComponentsBuilder #25951
    • Deprecate StringUtils.isEmpty(Object) and replace remaining usage (e.g. with ObjectUtils.isEmpty) #25945
    • Introduce RouterFunction attributes #25938
    • Discover @Sql, @SqlConfig, @SqlGroup, & @SqlMergeMode on enclosing class for nested test class #25913
    • Support Propagation.NEVER for disabling test-managed transactions #25909
    • Extensible invocation of TcpClient in ReactorNettyTcpClient #25889
    • Ignore duplicate configuration metadata for cache key in the TestContext framework #25800
    • Avoid use of String's for ContentDisposition type #25647
    • Expose access to STOMP SimpleMessageBroker sessions user Principal #25191
    • Allow programmatic registration of completion and error callbacks to transactional event listeners #24163
    • Support suspending functions annotated with @Transactional #23575
    • StompBrokerRelay doesn't send heartbeats to broker when @MessageMapping handles received messages #22822

    :beetle: Bug Fixes

    • @NestedTestConfiguration should not be discovered on enclosing class for nested interface #25917
    • UriComponentsBuilder controller method argument has no path #25822
    • Support multiple matchers in MockMvc Kotlin DSL #24103

    :notebook_with_decorative_cover: Documentation

    • Document @NestedTestConfiguration support #25912
    • Improve R2DBC DatabaseClient documentation regarding array/Collection-like bind parameters #25860
    • Document @DynamicPropertySource use cases that require @DirtiesContext #25850
    • Use lowercase property names in SpEL examples #25538

    :hammer: Dependency Upgrades

    • Upgrade to Kotlin Coroutines 1.4.0 #25969
    • Upgrade to RSocket 1.1.0 #25956
    • Upgrade to Reactor 2020.0.0 #25947
    • Upgrade to Gradle 6.7 #25918

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.2.10.RELEASE(Oct 27, 2020)

    :star: New Features

    • Optimize Jackson resource management in codecs #25910
    • Avoid creation of unused logger instance in AbstractMediaTypeExpression #25901
    • Native Hibernate 5 bootstrapping with JTA transaction manager requires hibernate.transaction.coordinator_class=jta to be set #25858
    • Cannot test @RequestPart multipart controllers with Servlet MockPart #25829
    • Add MariaDB to the supported database products for procedures and functions #25811
    • Optimize String argument resolution in MessageTag #25809
    • Avoid repeated Charset resolution in MimeType #25808

    :beetle: Bug Fixes

    • Incorrect http response for a request using the Range header for pre-compressed resources #25976
    • @ActiveProfiles with same profiles but different order results in duplicate ApplicationContext #25973
    • LinkedMultiValueMap downstream issue with MultiValueMapAdapter package private base class #25960
    • DataBufferUtils.CompositeMatcher causes poor performance when one or more matchers does not match #25915
    • HttpSeverOperations overrides content-length to 0 on HTTP HEAD #25908
    • jsessionid breaks request mappings when removeSemicolonContent is turned off #25864
    • JettyClientHttpConnector triggers early cancellation #25849
    • Race condition in DataBufferUtils.readAsynchronousFileChannel resulting in FD leak (Channel remains open) #25831
    • SimpMessagingTemplate.convertAndSend results in UnsupportedOperationException when Spring Cloud Sleuth is present #25821
    • ClassCastException when wiring bean using method injection (NullBean instead of 'null') #25806
    • Thread-scoped bean creation freezes if dependent bean is retrieved before dependency bean #25801
    • Sending an event as part of the EMF lock triggers a deadlock #25799
    • Wrong type inference in Kotlin while overriding RequestMappingHandlerMapping#getMappingForMethod #25657
    • SseEmitter (ResponseBodyEmitter) keeps collecting messages if not initialized #25442

    :notebook_with_decorative_cover: Documentation

    • Correct DispatcherServlet initialization sample webmvc.adoc #25965
    • Document that TransactionalEventListener only works with non-reactive transactions #25805
    • Published reference documentation contains unnecessary folders and files #25783
    • Incorrect example in javadocs of Assert.notNull(object, messageSupplier) #25774

    :hammer: Dependency Upgrades

    • Upgrade to RSocket 1.0.3 #25957
    • Upgrade to Reactor Dysprosium-SR13 #25946
    Source code(tar.gz)
    Source code(zip)
  • v5.1.19.RELEASE(Oct 27, 2020)

    :star: New Features

    • Optimize String argument resolution in MessageTag #25923
    • Avoid creation of unused logger instance in AbstractMediaTypeExpression #25902
    • Cannot test @RequestPart multipart controllers with Servlet MockPart #25894
    • Native Hibernate 5 bootstrapping with JTA transaction manager requires hibernate.transaction.coordinator_class=jta to be set #25862
    • Add MariaDB to the supported database products for procedures and functions #25812

    :beetle: Bug Fixes

    • Incorrect http response for a request using the Range header for pre-compressed resources #25979
    • @ActiveProfiles with same profiles but different order results in duplicate ApplicationContext #25974
    • LinkedMultiValueMap downstream issue with MultiValueMapAdapter package private base class #25961
    • jsessionid breaks request mappings when removeSemicolonContent is turned off #25867
    • SimpMessagingTemplate.convertAndSend results in UnsupportedOperationException when Spring Cloud Sleuth is present #25835
    • Wrong type inference in Kotlin while overriding RequestMappingHandlerMapping#getMappingForMethod #25818
    • ClassCastException when wiring bean using method injection (NullBean instead of 'null') #25807

    :notebook_with_decorative_cover: Documentation

    • Published reference documentation contains unnecessary folders and files #25794
    • Incorrect example in javadocs of Assert.notNull(object, messageSupplier) #25775

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Californium-SR22 #25948
    Source code(tar.gz)
    Source code(zip)
  • v5.3.0-RC2(Oct 13, 2020)

    :star: New Features

    • Compatibility with Jackson 2.12 #25907
    • Loggers apparently constructed on a per HTTP request basis in reactive web code cause CPU overhead #25900
    • @ControllerAdvice order defined via @Order on a @Bean method is not applied #25872
    • Add missing awaitBodilessEntity and createExceptionAndAwait ClientResponse extensions #25866
    • Add Dependencies Manifest Entry to spring-core #25852
    • Subclasses of UrlBasedViewResolver could avoid reflection when creating instances of View #25847
    • Add option to disable Last-Modified handling when serving static resources #25845
    • FormHttpMessageConverter to preserve parameters from the input MediaType #25839
    • Request data binding fails for params with an empty array "[]" suffix #25836
    • Support for an async determination of status and headers with a WebMvc HandlerFunction #25828
    • Deprecate LiveBeansView #25820
    • MultipartFile[] required controller param, not throwing exception #25819
    • Optimize StringUtils trimLeading/Trailing methods #25810
    • Set the sameSite cookie attribute in ClientHttpResponse implementations #25785
    • Unable to change Clock for spring framework scheduling #25782
    • Resolve Principal argument only when not annotated #25780
    • Use the function endpoint, filter the handler function, and find that remoteAddress is null, params is empty #25776
    • Add kotlinx.serialization JSON support to Spring WebFlux #25771
    • Make path pattern optional in router functions #25752
    • Deprecate WebClient#exchange() and provide safer alternatives #25751
    • Easing the application of CORS default settings through the WebMvcConfigurer#corsConfigurer method #25716
    • Empty or blank required UUID header validation results in 200 response status #23939
    • Support suspending handler methods in Spring MVC #23611
    • Introduce Converter.andThen(...) #23379
    • Remove inefficiency in HttpStatus.series() #22366
    • Provide Gson/JSON-B MessageConverter for spring-messaging (aligned with spring-web) #21496
    • Discover test configuration on enclosing class for nested test class [SPR-15366] #19930

    :beetle: Bug Fixes

    • WebTestClient no longer captures the URI template #25854
    • Webflux Routing DSL's onError filters execute in unexpected order #25541
    • TransactionalOperator.executeAndAwait returns value too early #25007

    :notebook_with_decorative_cover: Documentation

    • Document DefaultPartHttpMessageReader #25827
    • Update WebFlux documentation with regards to logging appenders #25547
    • Upgrade to Asciidoctor Gradle plugin 3.x #24991

    :hammer: Dependency Upgrades

    • Upgrade to Kotlin Coroutines 1.4.0-M1 #25914
    • Upgrade to RSocket 1.1.0-RC1 #25898
    • Upgrade to Reactor 2020.0.0-RC2 #25884
    • Upgrade to Kotlin 1.4.10 #25779

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.0-RC1(Sep 15, 2020)

    :star: New Features

    • MimeMessageHelper should not encode attachment filenames by default #25770
    • A beforeCommit chain failure invariably results in a 500 response #25753
    • Improve performance of JdkDynamicAopProxy.getProxy(ClassLoader) #25660
    • Add URI variables to request context in AbstractUrlHandlerMapping (reactive) #25648
    • Public method in RSocketMessageHandler to register any handler method #25639
    • Allow early decoration of request and response in WebFlux #25633
    • Spring Test: Methods should allow supertypes of Matcher using lower bounded wildcards #25610
    • WebSocket configuration doesn't work properly with the buffer size limitation #25581
    • Declare interfaces as @FunctionalInterface where feasible #25580
    • Call StartupStep.end in finally block #25572
    • Support filename hint for client side use of ResourceDecoder #25516
    • No way to set timeout for the requests when using Jetty reactive httpclient #25493
    • Mime type "application/*" is not compatible with "application/vnd+json" #25350
    • Avoid resizing of fixed-size HashMap #25349
    • Support RSocket Load Balancing #25333
    • WebClient HTTP Request Timeout #25115
    • Support a RowMapper<T> for Java record classes #24695
    • Data binding for Java record classes #24391
    • Failure to bind a component of a form backing object using constructor binding causes the object to be null #24372
    • Concurrent access to ParsedSql cache in NamedParameterJdbcTemplate #24197
    • WebClient: wrap connection exceptions #23842
    • Extract MimeTypeUtils.ConcurrentLruCache and make it public #22789
    • WebSocket support with @EnableWebFlux #22587
    • Add kotlinx.serialization JSON support to Spring MVC #21188
    • Common API for MockMvc tests and for real HTTP tests #19647

    :beetle: Bug Fixes

    • Upgrading from Boot 2.3.3 or 2.4-M1 to Boot 2.4-M2 uses 125mb heap in BitsCronField #25687
    • Copy httpHandlerDecorator in copy constructor for WebHttpHandlerBuilder #25656
    • MockMvc does not correctly initialize the request for non-file mock Part uploads #25602
    • WebFlux application server add server.forward- Headers - Strategy = Framework RouterFunction endpoint 404 #25270

    :notebook_with_decorative_cover: Documentation

    • Fix typo in Regular Expression Pointcuts docs #25767
    • Fix typo regarding Ordered interface in core-aop.adoc #25759
    • Fix typo in websocket.adoc #25630
    • Eliminate unnecessary word in core-bean.adoc that causes repetition #25585
    • Publish documentation under reference/html folder #25071

    :hammer: Dependency Upgrades

    • Upgrade to RSocket 1.1 M2 #25729
    • Upgrade to Reactor 2020 RC1 #25728
    • Upgrade to Kotlin 1.4.0 #25617
    • Upgrade to Gradle 6.6 #25578
    • Upgrade to JUnit 5.7 #25527

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v4.3.29.RELEASE(Sep 15, 2020)

    :star: New Features

    • PropertiesLoaderSupport should ignore socket/connect exceptions as well #25722
    • Refine use of substring operations #25515

    :beetle: Bug Fixes

    • VerifyErrors when using SpEL compilation with Thymeleaf when invoking a default method defined in an interface #25713
    • SQLErrorCodesFactory.getErrorCodes(DataSource) returns empty error codes if access to transactional connection fails #25694
    • Potential integer overflow in AbstractResourceBasedMessageSource.setCacheSeconds(int) #25644
    • Lazy dependency proxy does not populate bean dependencies #25565
    • Synchronized blocks in MethodOverrides are hurting concurrency #25549
    • StaticListableBeanFactory.isSingleton() returns false for singleton beans #25525
    • MockHttpServletResponse reset() does not reset charset field #25512

    :notebook_with_decorative_cover: Documentation

    • Prevent confusion about build(boolean) method in UriComponentsBuilder #25703
    Source code(tar.gz)
    Source code(zip)
  • v5.0.19.RELEASE(Sep 15, 2020)

    :star: New Features

    • PropertiesLoaderSupport should ignore socket/connect exceptions as well #25721
    • Possible optimization in UrlResource #25551
    • Refine use of substring operations #25514

    :beetle: Bug Fixes

    • FileUrlResource isWritable method returns true if URL protocol is not indicating a file #25740
    • VerifyErrors when using SpEL compilation with Thymeleaf when invoking a default method defined in an interface #25712
    • CallMetaDataContext.reconcileParameters overwrites cursor name #25709
    • SQLErrorCodesFactory.getErrorCodes(DataSource) returns empty error codes if access to transactional connection fails #25693
    • Joda-Time presence check fails to detect Joda-Time 2.x specifically #25659
    • Potential integer overflow in AbstractResourceBasedMessageSource.setCacheSeconds(int) #25643
    • Lazy dependency proxy does not populate bean dependencies #25564
    • StaticListableBeanFactory.isSingleton() returns false for singleton beans #25524
    • MockHttpServletResponse reset() does not reset charset field #25511

    :notebook_with_decorative_cover: Documentation

    • Document how to specify Jackson JSON view serialization hints with @RestController and Webflux #25705
    • Prevent confusion about build(boolean) method in UriComponentsBuilder #25702
    Source code(tar.gz)
    Source code(zip)
  • v5.1.18.RELEASE(Sep 15, 2020)

    :star: New Features

    • PropertiesLoaderSupport should ignore socket/connect exceptions as well #25720
    • Avoid full singleton lock for DefaultSingletonBeanRegistry.getSingleton(beanName, false) #25695
    • Possible optimization in UrlResource #25550
    • Refine use of substring operations #25513

    :beetle: Bug Fixes

    • FileUrlResource isWritable method returns true if URL protocol is not indicating a file #25739
    • VerifyErrors when using SpEL compilation with Thymeleaf when invoking a default method defined in an interface #25711
    • CallMetaDataContext.reconcileParameters overwrites cursor name #25708
    • SQLErrorCodesFactory.getErrorCodes(DataSource) returns empty error codes if access to transactional connection fails #25692
    • Make "org.springframework.util.unit.DataSize" class Serializable #25676
    • Joda-Time presence check fails to detect Joda-Time 2.x specifically #25658
    • Potential integer overflow in AbstractResourceBasedMessageSource.setCacheSeconds(int) #25642
    • Lazy dependency proxy does not populate bean dependencies #25563
    • StaticListableBeanFactory.isSingleton() returns false for singleton beans #25523
    • MockHttpServletResponse reset() does not reset charset field #25510

    :notebook_with_decorative_cover: Documentation

    • Document how to specify Jackson JSON view serialization hints with @RestController and Webflux #25704
    • Prevent confusion about build(boolean) method in UriComponentsBuilder #25701

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Californium-SR21 #25731
    Source code(tar.gz)
    Source code(zip)
  • v5.2.9.RELEASE(Sep 15, 2020)

    :star: New Features

    • HttpHeaders.setContentDispositionFormData should ignore empty filename #25769
    • StringDecoder does not provide a way to configure the default charset #25762
    • MimeMessageHelper.addAttachment: configurable encoding of attachment filename #25755
    • Current log level not checked by LogAccessor supplier-enabled logging methods #25741
    • PropertiesLoaderSupport should ignore socket/connect exceptions as well #25717
    • Avoid repeated calls to getPathWithinApplication from UrlPathHelper.getLookupPathForRequest #25669
    • Avoid full singleton lock for DefaultSingletonBeanRegistry.getSingleton(beanName, false) #25667
    • XStreamMarshaller should avoid direct use of CompositeClassLoader which is not exported by XStream in OSGi #25662
    • Avoid LinkedList performance issues through use of ArrayDeque #25652
    • Introduce createContext() factory method in AbstractGenericContextLoader #25600
    • Declare MessagePostProcessor as a @FunctionalInterface #25571
    • Assert preconditions for MergedAnnotations.from() factory methods #25568
    • Provide access to AbstractRoutingDataSource's resolved target DataSources #25544
    • Possible optimization in UrlResource #25531
    • Refine use of substring operations #25445
    • Cache abstraction does not log hit / miss for synchronized access #25248

    :beetle: Bug Fixes

    • Issue with Forwarded Header and Multiple Values #25737
    • CallMetaDataContext.reconcileParameters overwrites cursor name #25707
    • VerifyErrors when using SpEL compilation with Thymeleaf when invoking a default method defined in an interface #25706
    • SQLErrorCodesFactory.getErrorCodes(DataSource) returns empty error codes if access to transactional connection fails #25681
    • Make "org.springframework.util.unit.DataSize" class Serializable #25675
    • Joda-Time presence check fails to detect Joda-Time 2.x specifically #25655
    • Regression in SimpleThreadScope introduced in 5.2.7 #25618
    • Potential integer overflow in ExecutorConfigurationSupport.setAwaitTerminationSeconds(int) and AbstractResourceBasedMessageSource.setCacheSeconds(int) #25613
    • Remove session on 4xx response from WebSocket handshake #25608
    • spring-jdbc don't set out parameter name from metadata for Postgresql function after issue#25399 #25588
    • FileUrlResource isWritable method returns true if URL protocol is not indicating a file #25584
    • Lazy dependency proxy does not populate bean dependencies #25562
    • Bean creation fails with StackOverflowError after upgrading from 5.1.13 to 5.2.7 #25546
    • StaticListableBeanFactory.isSingleton() returns false for singleton beans #25522
    • Standalone MockMvc ignores @RestControllerAdvice annotation attributes #25520
    • MockHttpServletResponse reset() does not reset charset field #25501
    • AnnotationTypeMappings does not filter repeatable annotations #25483
    • Wrong error message for type mismatch in jsonPath().value() #25480
    • Fix infinite loop bug in AnnotationScanner #25429
    • Overloaded @Bean method with name mismatch causes bean to be created twice (in case of ASM processing) #25263

    :notebook_with_decorative_cover: Documentation

    • Prevent confusion about build(boolean) method in UriComponentsBuilder #25604
    • Document how to specify Jackson JSON view serialization hints with @RestController and Webflux #25596
    • Inconsistent log level in @Bean javadoc and ConfigurationClassEnhancer #25590
    • Fix asciidoctor syntax for source #25539
    • Improve Javadoc for @RequestMapping#params #25482
    • Document that SimpleCacheManager requires caches to be initialized when not used as a bean #22988

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR12 #25730

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
  • v5.3.0-M2(Aug 11, 2020)

    :star: New Features

    • Introduce getBeanProvider variants with allowEagerInit flag #25559
    • Allow to access the underlying ConnectionFactory from DatabaseClient #25521
    • Optimize DefaultLifecycleProcessor::startBeans #25506
    • Refactoring opportunity in HandlerExecutionChain #25500
    • Support macros in crontab expressions #25471
    • Introduce CronExpression #25464
    • Use System.currentTimeMillis() in AbstractSockJsService #25447
    • Simplified return statement #25415
    • Improve UriComponents.sanitizeSource() #25401
    • Use Math.min() in ExponentialBackOff #25381
    • Allow auto grow for entries without default constructor in SpEL #25367
    • Remove redundant Character.toLowerCase() in BeanPropertyRowMapper #25361
    • Leverage spring.ignore.xml flag to avoid XmlBeanDefinitionReader #25338
    • Leverage spring.ignore.xml flag to avoid SQLErrorCodeSQLExceptionTranslator #25335
    • Check for valid IPv6 host in UriComponentsBuilder.fromUriString #25334
    • Support use of RSocketClient #25332
    • Enhance HandlerMappingIntrospector to cache parsed patterns #25312
    • DefaultSubscriptionRegistry: Reduced thread contention #25298
    • Support multiple Content-Language header values in MockHttpServletResponse #25281
    • added possibility to extend ModelAttributeMethodArgumentResolver #25265
    • WebSocketMessage's methods fromMessage and toFrames ignore Netty WebSocketFrame metadata #25099
    • Support for pattern based origin cors configuration #25016
    • Collect metrics during application context startup #24878
    • Sort detected PersistenceExceptionTranslator beans #24644
    • Constructor based bean binding should support url path variables, not only request parameters #24107
    • Feature request: provide support for JSR 310 types in CronTrigger #23496
    • RouterFunction does not respect path matching set in WebFluxConfigurer #23236
    • Turn MethodArgumentNotValidException into subclass of BindException #23107
    • Support for direct path lookups in WebFlux #22961
    • ExceptionHandlerExceptionResolver should support exceptions from any handler #22619
    • @Scheduled(cron = "0 0 0 ? * 5#3") is not supported #22436
    • Consider updating the default Hibernate dialect for MySQL databases #22326
    • Spring MVC - Kotlin: Cannot bind MultipartFile in constructor [SPR-17640] #22169
    • Support JSON streaming formats besides application/stream+json #21283
    • Support raising exception with a custom HTTP status code #20336
    • Support for the last day in month cron expression [SPR-15547] #20106
    • Cron Expression validation [SPR-14933] #19500
    • Cron expression with fixed weekday and fixed date may or may not lead to IllegalStateException (runaway search for next trigger) [SPR-8981] #13621

    :beetle: Bug Fixes

    • MockHttpServletResponse's setCharacterEncoding() does not update contentType property #25536
    • Bean overriding for 'taskExecutor' alias is not detected #25430
    • Creating ServerRequest from MockHttpServletRequest changed behaviour 5.3.0-M1 #25353
    • CaffeineCache does not support LoadingCache consistently #25173
    • CronSequenceGenerator - Friday 13th issue [SPR-17036] #21574

    :notebook_with_decorative_cover: Documentation

    • Use Groovy syntax highlighting in reference manual #25554
    • Fix comment syntax in xml examples #25537
    • Fix links in Javadoc #25448
    • Fix typo in javadoc #25396
    • Add logging reference documentation [SPR-17626] #22158

    :hammer: Dependency Upgrades

    • Upgrade to Jackson 2.11.2 #25398
    • Upgrade to Reactor 2020.0.0-M2 #25373
    • Upgrade to RSocket 1.1 M1 #25331
    • Upgrade to ASM 9.0 #24872
    • Upgrade to Kotlin 1.4 RC #24171

    :heart: Contributors

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

    Source code(tar.gz)
    Source code(zip)
🚀 The best rbac web framework. base on Spring Boot 2.4、 Spring Cloud 2020、 OAuth2 . Thx Give a star

?? The best rbac web framework. base on Spring Boot 2.4、 Spring Cloud 2020、 OAuth2 . Thx Give a star

pig-mesh 1.6k Sep 9, 2021
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.5k Sep 8, 2021
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 Sep 11, 2021
This is a Playwright Java Framework written in POM

Playwright Java Framework Main Objective of this Framework is to Build an Automation Framework that can be scalable, Easily Configurable and Ready to

AutoInfra 4 Aug 18, 2021
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 582 Sep 14, 2021
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 689 Sep 10, 2021
DEPRECATED: use https://github.com/jhipster/jhipster-bom instead

JHipster BOM and server-side library - DEPRECATED Full documentation and information is available on our website at https://www.jhipster.tech/ This pr

JHipster 402 Sep 1, 2021
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 12k Sep 8, 2021
: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.5k Sep 4, 2021
: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.5k Sep 7, 2021
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.2k Sep 17, 2021
Ninja is a full stack web framework for Java. Rock solid, fast and super productive.

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

Ninja Web Framework 1.9k Aug 31, 2021
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 758 Sep 14, 2021
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 Aug 30, 2021
JavaWeb MemoryShell Inject/Scan/Killer/Protect Research & Exploring

Memory Shell JavaWeb MemoryShell Inject/Scan/Killer/Protect Research & Exploring 文章:JavaWeb 内存马一周目通关攻略 项目介绍 本项目用来学习和研究 JavaWeb 内存马添加和防御模式,共包含以下几个模块。 m

素十八 145 Sep 14, 2021
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.4k Sep 15, 2021
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 279 Sep 15, 2021
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.2k Sep 9, 2021
an awesome automation test framework

PnxTest PnxTest is a Java-based test automation framework that unites all testing layers: Mobile applications, WEB applications, REST services. Due to

nicolas chen 19 Aug 31, 2021