Consistent nullability for concurrent result
(cherry picked from commit b92877990d)
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2023 the original author or authors.
|
* Copyright 2002-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -159,6 +159,7 @@ public final class WebAsyncManager {
|
|||||||
* concurrent handling raised one.
|
* concurrent handling raised one.
|
||||||
* @see #clearConcurrentResult()
|
* @see #clearConcurrentResult()
|
||||||
*/
|
*/
|
||||||
|
@Nullable
|
||||||
public Object getConcurrentResult() {
|
public Object getConcurrentResult() {
|
||||||
return this.concurrentResult;
|
return this.concurrentResult;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2022 the original author or authors.
|
* Copyright 2002-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -48,6 +48,7 @@ import org.springframework.http.converter.StringHttpMessageConverter;
|
|||||||
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
|
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.ui.ModelMap;
|
import org.springframework.ui.ModelMap;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.ReflectionUtils.MethodFilter;
|
import org.springframework.util.ReflectionUtils.MethodFilter;
|
||||||
import org.springframework.web.accept.ContentNegotiationManager;
|
import org.springframework.web.accept.ContentNegotiationManager;
|
||||||
@@ -872,7 +873,9 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
|
|||||||
|
|
||||||
if (asyncManager.hasConcurrentResult()) {
|
if (asyncManager.hasConcurrentResult()) {
|
||||||
Object result = asyncManager.getConcurrentResult();
|
Object result = asyncManager.getConcurrentResult();
|
||||||
mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
|
Object[] resultContext = asyncManager.getConcurrentResultContext();
|
||||||
|
Assert.state(resultContext != null && resultContext.length > 0, "Missing result context");
|
||||||
|
mavContainer = (ModelAndViewContainer) resultContext[0];
|
||||||
asyncManager.clearConcurrentResult();
|
asyncManager.clearConcurrentResult();
|
||||||
LogFormatUtils.traceDebug(logger, traceOn -> {
|
LogFormatUtils.traceDebug(logger, traceOn -> {
|
||||||
String formatted = LogFormatUtils.formatValue(result, !traceOn);
|
String formatted = LogFormatUtils.formatValue(result, !traceOn);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2023 the original author or authors.
|
* Copyright 2002-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -200,7 +200,7 @@ public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
|
|||||||
* actually invoking the controller method. This is useful when processing
|
* actually invoking the controller method. This is useful when processing
|
||||||
* async return values (e.g. Callable, DeferredResult, ListenableFuture).
|
* async return values (e.g. Callable, DeferredResult, ListenableFuture).
|
||||||
*/
|
*/
|
||||||
ServletInvocableHandlerMethod wrapConcurrentResult(Object result) {
|
ServletInvocableHandlerMethod wrapConcurrentResult(@Nullable Object result) {
|
||||||
return new ConcurrentResultHandlerMethod(result, new ConcurrentResultMethodParameter(result));
|
return new ConcurrentResultHandlerMethod(result, new ConcurrentResultMethodParameter(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,7 +215,7 @@ public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
|
|||||||
|
|
||||||
private final MethodParameter returnType;
|
private final MethodParameter returnType;
|
||||||
|
|
||||||
public ConcurrentResultHandlerMethod(final Object result, ConcurrentResultMethodParameter returnType) {
|
public ConcurrentResultHandlerMethod(@Nullable Object result, ConcurrentResultMethodParameter returnType) {
|
||||||
super((Callable<Object>) () -> {
|
super((Callable<Object>) () -> {
|
||||||
if (result instanceof Exception exception) {
|
if (result instanceof Exception exception) {
|
||||||
throw exception;
|
throw exception;
|
||||||
@@ -279,7 +279,7 @@ public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
|
|||||||
|
|
||||||
private final ResolvableType returnType;
|
private final ResolvableType returnType;
|
||||||
|
|
||||||
public ConcurrentResultMethodParameter(Object returnValue) {
|
public ConcurrentResultMethodParameter(@Nullable Object returnValue) {
|
||||||
super(-1);
|
super(-1);
|
||||||
this.returnValue = returnValue;
|
this.returnValue = returnValue;
|
||||||
this.returnType = (returnValue instanceof CollectedValuesList cvList ?
|
this.returnType = (returnValue instanceof CollectedValuesList cvList ?
|
||||||
|
|||||||
Reference in New Issue
Block a user