@ -40,8 +40,11 @@ import org.springframework.lang.Nullable;
@@ -40,8 +40,11 @@ import org.springframework.lang.Nullable;
import org.springframework.util.Assert ;
import org.springframework.util.ClassUtils ;
import org.springframework.util.MultiValueMap ;
import org.springframework.web.context.request.NativeWebRequest ;
import org.springframework.web.context.request.RequestAttributes ;
import org.springframework.web.context.request.async.AsyncWebRequest ;
import org.springframework.web.context.request.async.DeferredResult ;
import org.springframework.web.context.request.async.DeferredResultProcessingInterceptor ;
import org.springframework.web.context.request.async.WebAsyncManager ;
import org.springframework.web.context.request.async.WebAsyncUtils ;
import org.springframework.web.servlet.ModelAndView ;
@ -54,6 +57,16 @@ import org.springframework.web.servlet.ModelAndView;
@@ -54,6 +57,16 @@ import org.springframework.web.servlet.ModelAndView;
* /
final class DefaultAsyncServerResponse extends ErrorHandlingServerResponse implements AsyncServerResponse {
private static final DeferredResultProcessingInterceptor CLEAR_PATTERN_ATTRIBUTE_INTERCEPTOR =
new DeferredResultProcessingInterceptor ( ) {
@Override
public < T > void postProcess ( NativeWebRequest request , DeferredResult < T > deferredResult ,
Object concurrentResult ) {
request . removeAttribute ( RouterFunctions . MATCHING_PATTERN_ATTRIBUTE ,
RequestAttributes . SCOPE_REQUEST ) ;
}
} ;
static final boolean reactiveStreamsPresent = ClassUtils . isPresent (
"org.reactivestreams.Publisher" , DefaultAsyncServerResponse . class . getClassLoader ( ) ) ;
@ -128,6 +141,7 @@ final class DefaultAsyncServerResponse extends ErrorHandlingServerResponse imple
@@ -128,6 +141,7 @@ final class DefaultAsyncServerResponse extends ErrorHandlingServerResponse imple
WebAsyncManager asyncManager = WebAsyncUtils . getAsyncManager ( request ) ;
AsyncWebRequest asyncWebRequest = WebAsyncUtils . createAsyncWebRequest ( request , response ) ;
asyncManager . setAsyncWebRequest ( asyncWebRequest ) ;
asyncManager . registerDeferredResultInterceptors ( CLEAR_PATTERN_ATTRIBUTE_INTERCEPTOR ) ;
try {
asyncManager . startDeferredResultProcessing ( deferredResult ) ;
}