提交 8f4eb235 编写于 作者: R Rossen Stoyanchev

Remove use of Optional in SyncHandlerMethodArgumentResolver

... and a couple more protected methods in WebFlux

Issue: SPR-15718
上级 7de6cfa1
......@@ -23,7 +23,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.databind.JavaType;
......@@ -91,19 +90,21 @@ public abstract class Jackson2CodecSupport {
}
protected Map<String, Object> getHints(ResolvableType resolvableType) {
return getParameter(resolvableType)
.flatMap(parameter -> Optional.ofNullable(getAnnotation(parameter, JsonView.class))
.map(annotation -> {
Class<?>[] classes = annotation.value();
Assert.isTrue(classes.length == 1, JSON_VIEW_HINT_ERROR + parameter);
return Collections.<String, Object>singletonMap(JSON_VIEW_HINT, classes[0]);
}))
.orElse(Collections.emptyMap());
MethodParameter param = getParameter(resolvableType);
if (param != null) {
JsonView annotation = getAnnotation(param, JsonView.class);
if (annotation != null) {
Class<?>[] classes = annotation.value();
Assert.isTrue(classes.length == 1, JSON_VIEW_HINT_ERROR + param);
return Collections.singletonMap(JSON_VIEW_HINT, classes[0]);
}
}
return Collections.emptyMap();
}
protected Optional<MethodParameter> getParameter(ResolvableType type) {
return Optional.ofNullable(type.getSource() instanceof MethodParameter ?
(MethodParameter) type.getSource() : null);
@Nullable
protected MethodParameter getParameter(ResolvableType type) {
return type.getSource() instanceof MethodParameter ? (MethodParameter) type.getSource() : null;
}
@Nullable
......
......@@ -109,7 +109,8 @@ public class Jackson2JsonDecoder extends Jackson2CodecSupport implements HttpMes
Assert.notNull(tokens, "'tokens' must not be null");
Assert.notNull(elementType, "'elementType' must not be null");
Class<?> contextClass = getParameter(elementType).map(MethodParameter::getContainingClass).orElse(null);
MethodParameter param = getParameter(elementType);
Class<?> contextClass = (param != null ? param.getContainingClass() : null);
JavaType javaType = getJavaType(elementType.getType(), contextClass);
Class<?> jsonView = (hints != null ? (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT) : null);
......
......@@ -21,6 +21,7 @@ import java.util.Optional;
import reactor.core.publisher.Mono;
import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.web.reactive.BindingContext;
import org.springframework.web.server.ServerWebExchange;
......@@ -50,9 +51,10 @@ public interface SyncHandlerMethodArgumentResolver extends HandlerMethodArgument
* @param parameter the method parameter
* @param bindingContext the binding context to use
* @param exchange the current exchange
* @return an {@code Optional} with the resolved value, possibly empty
* @return the resolved value, if any
*/
Optional<Object> resolveArgumentValue(
MethodParameter parameter, BindingContext bindingContext, ServerWebExchange exchange);
@Nullable
Object resolveArgumentValue(MethodParameter parameter, BindingContext bindingContext,
ServerWebExchange exchange);
}
......@@ -16,8 +16,6 @@
package org.springframework.web.reactive.result.method.annotation;
import java.util.Optional;
import reactor.core.publisher.Mono;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
......@@ -64,13 +62,11 @@ public abstract class AbstractNamedValueSyncArgumentResolver extends AbstractNam
}
@Override
public Optional<Object> resolveArgumentValue(
MethodParameter parameter, BindingContext context, ServerWebExchange exchange) {
public Object resolveArgumentValue(MethodParameter parameter, BindingContext context,
ServerWebExchange exchange) {
// This won't block since resolveName below doesn't
Object value = resolveArgument(parameter, context, exchange).block();
return Optional.ofNullable(value);
return resolveArgument(parameter, context, exchange).block();
}
@Override
......
......@@ -21,7 +21,6 @@ import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
......@@ -53,7 +52,7 @@ import org.springframework.web.reactive.result.method.InvocableHandlerMethod;
import org.springframework.web.reactive.result.method.SyncHandlerMethodArgumentResolver;
import org.springframework.web.reactive.result.method.SyncInvocableHandlerMethod;
import static org.springframework.core.MethodIntrospector.*;
import static org.springframework.core.MethodIntrospector.selectMethods;
/**
* Package-private class to assist {@link RequestMappingHandlerAdapter} with
......@@ -284,8 +283,8 @@ class ControllerMethodResolver {
* Find an {@code @ExceptionHandler} method in {@code @ControllerAdvice}
* components or in the controller of the given {@code @RequestMapping} method.
*/
public Optional<InvocableHandlerMethod> getExceptionHandlerMethod(Throwable ex,
HandlerMethod handlerMethod) {
@Nullable
public InvocableHandlerMethod getExceptionHandlerMethod(Throwable ex, HandlerMethod handlerMethod) {
Class<?> handlerType = handlerMethod.getBeanType();
......@@ -309,12 +308,12 @@ class ControllerMethodResolver {
}
if (targetMethod == null) {
return Optional.empty();
return null;
}
InvocableHandlerMethod invocable = new InvocableHandlerMethod(targetBean, targetMethod);
invocable.setArgumentResolvers(this.exceptionHandlerResolvers);
return Optional.of(invocable);
return invocable;
}
......
......@@ -16,8 +16,6 @@
package org.springframework.web.reactive.result.method.annotation;
import java.util.Optional;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.ui.Model;
......@@ -47,11 +45,11 @@ public class ModelArgumentResolver extends HandlerMethodArgumentResolverSupport
}
@Override
public Optional<Object> resolveArgumentValue(MethodParameter methodParameter,
BindingContext context, ServerWebExchange exchange) {
public Object resolveArgumentValue(MethodParameter methodParameter, BindingContext context,
ServerWebExchange exchange) {
Assert.isAssignable(Model.class, methodParameter.getParameterType());
return Optional.of(context.getModel());
return context.getModel();
}
}
......@@ -18,7 +18,6 @@ package org.springframework.web.reactive.result.method.annotation;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry;
......@@ -59,12 +58,11 @@ public class PathVariableMapMethodArgumentResolver extends HandlerMethodArgument
@Override
public Optional<Object> resolveArgumentValue(MethodParameter methodParameter,
BindingContext context, ServerWebExchange exchange) {
public Object resolveArgumentValue(MethodParameter methodParameter, BindingContext context,
ServerWebExchange exchange) {
String name = HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE;
Object value = exchange.getAttributeOrDefault(name, Collections.emptyMap());
return Optional.of(value);
return exchange.getAttributeOrDefault(name, Collections.emptyMap());
}
}
......@@ -17,7 +17,6 @@
package org.springframework.web.reactive.result.method.annotation;
import java.util.Map;
import java.util.Optional;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry;
......@@ -61,14 +60,14 @@ public class RequestHeaderMapMethodArgumentResolver extends HandlerMethodArgumen
@Override
public Optional<Object> resolveArgumentValue(MethodParameter methodParameter,
public Object resolveArgumentValue(MethodParameter methodParameter,
BindingContext context, ServerWebExchange exchange) {
Class<?> paramType = methodParameter.getParameterType();
boolean isMultiValueMap = MultiValueMap.class.isAssignableFrom(paramType);
HttpHeaders headers = exchange.getRequest().getHeaders();
return Optional.of(isMultiValueMap ? headers : headers.toSingleValueMap());
return isMultiValueMap ? headers : headers.toSingleValueMap();
}
}
......@@ -197,24 +197,23 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Application
private Mono<HandlerResult> handleException(Throwable ex, HandlerMethod handlerMethod,
BindingContext bindingContext, ServerWebExchange exchange) {
return this.methodResolver.getExceptionHandlerMethod(ex, handlerMethod)
.map(invocable -> {
try {
if (logger.isDebugEnabled()) {
logger.debug("Invoking @ExceptionHandler method: " + invocable.getMethod());
}
bindingContext.getModel().asMap().clear();
Throwable cause = ex.getCause() != null ? ex.getCause() : ex;
return invocable.invoke(exchange, bindingContext, cause, handlerMethod);
}
catch (Throwable invocationEx) {
if (logger.isWarnEnabled()) {
logger.warn("Failed to invoke: " + invocable.getMethod(), invocationEx);
}
return null;
}
})
.orElseGet(() -> Mono.error(ex));
InvocableHandlerMethod invocable = this.methodResolver.getExceptionHandlerMethod(ex, handlerMethod);
if (invocable != null) {
try {
if (logger.isDebugEnabled()) {
logger.debug("Invoking @ExceptionHandler method: " + invocable.getMethod());
}
bindingContext.getModel().asMap().clear();
Throwable cause = ex.getCause() != null ? ex.getCause() : ex;
return invocable.invoke(exchange, bindingContext, cause, handlerMethod);
}
catch (Throwable invocationEx) {
if (logger.isWarnEnabled()) {
logger.warn("Failed to invoke: " + invocable.getMethod(), invocationEx);
}
}
}
return Mono.error(ex);
}
}
......@@ -17,7 +17,6 @@
package org.springframework.web.reactive.result.method.annotation;
import java.util.Map;
import java.util.Optional;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry;
......@@ -65,13 +64,12 @@ public class RequestParamMapMethodArgumentResolver extends HandlerMethodArgument
@Override
public Optional<Object> resolveArgumentValue(MethodParameter methodParameter,
BindingContext context, ServerWebExchange exchange) {
public Object resolveArgumentValue(MethodParameter methodParameter, BindingContext context,
ServerWebExchange exchange) {
boolean isMultiValueMap = MultiValueMap.class.isAssignableFrom(methodParameter.getParameterType());
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
Object value = isMultiValueMap ? queryParams : queryParams.toSingleValueMap();
return Optional.of(value);
return isMultiValueMap ? queryParams : queryParams.toSingleValueMap();
}
}
......@@ -16,8 +16,6 @@
package org.springframework.web.reactive.result.method.annotation;
import java.util.Optional;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.http.HttpMethod;
......@@ -63,21 +61,21 @@ public class ServerWebExchangeArgumentResolver extends HandlerMethodArgumentReso
}
@Override
public Optional<Object> resolveArgumentValue(MethodParameter methodParameter,
BindingContext context, ServerWebExchange exchange) {
public Object resolveArgumentValue(MethodParameter methodParameter, BindingContext context,
ServerWebExchange exchange) {
Class<?> paramType = methodParameter.getParameterType();
if (ServerWebExchange.class.isAssignableFrom(paramType)) {
return Optional.of(exchange);
return exchange;
}
else if (ServerHttpRequest.class.isAssignableFrom(paramType)) {
return Optional.of(exchange.getRequest());
return exchange.getRequest();
}
else if (ServerHttpResponse.class.isAssignableFrom(paramType)) {
return Optional.of(exchange.getResponse());
return exchange.getResponse();
}
else if (HttpMethod.class == paramType) {
return Optional.ofNullable(exchange.getRequest().getMethod());
return exchange.getRequest().getMethod();
}
else {
// should never happen...
......
......@@ -187,11 +187,11 @@ public class ControllerMethodResolverTests {
@Test
public void exceptionHandlerArgumentResolvers() throws Exception {
Optional<InvocableHandlerMethod> optional =
InvocableHandlerMethod invocable =
this.methodResolver.getExceptionHandlerMethod(
new ResponseStatusException(HttpStatus.BAD_REQUEST, "reason"), this.handlerMethod);
InvocableHandlerMethod invocable = optional.orElseThrow(() -> new AssertionError("No match"));
assertNotNull("No match", invocable);
assertEquals(TestController.class, invocable.getBeanType());
List<HandlerMethodArgumentResolver> resolvers = invocable.getResolvers();
......@@ -221,11 +221,10 @@ public class ControllerMethodResolverTests {
@Test
public void exceptionHandlerFromControllerAdvice() throws Exception {
Optional<InvocableHandlerMethod> optional =
InvocableHandlerMethod invocable =
this.methodResolver.getExceptionHandlerMethod(
new IllegalStateException("reason"), this.handlerMethod);
InvocableHandlerMethod invocable = optional.orElseThrow(() -> new AssertionError("No match"));
assertNotNull(invocable);
assertEquals(TestControllerAdvice.class, invocable.getBeanType());
}
......@@ -286,7 +285,7 @@ public class ControllerMethodResolverTests {
implements SyncHandlerMethodArgumentResolver {
@Override
public Optional<Object> resolveArgumentValue(MethodParameter p, BindingContext c, ServerWebExchange e) {
public Object resolveArgumentValue(MethodParameter p, BindingContext c, ServerWebExchange e) {
return null;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册