org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration#org.springframework.web.reactive.result.method.HandlerMethodArgumentResolver源码实例Demo

下面列出了org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration#org.springframework.web.reactive.result.method.HandlerMethodArgumentResolver 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

@Test
public void requestMappingArgumentResolvers() {
	InvocableHandlerMethod invocable = this.methodResolver.getRequestMappingMethod(this.handlerMethod);
	List<HandlerMethodArgumentResolver> resolvers = invocable.getResolvers();

	AtomicInteger index = new AtomicInteger(-1);
	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestParamMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestBodyMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestPartMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CookieValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ExpressionValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(SessionAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(ContinuationHandlerMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(HttpEntityMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ErrorsMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ServerWebExchangeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PrincipalMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(SessionStatusMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(WebSessionMethodArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(CustomArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CustomSyncArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
}
 
@Test
public void modelAttributeArgumentResolvers() {
	List<InvocableHandlerMethod> methods = this.methodResolver.getModelAttributeMethods(this.handlerMethod);

	assertEquals("Expected one each from Controller + ControllerAdvice", 2, methods.size());
	InvocableHandlerMethod invocable = methods.get(0);
	List<HandlerMethodArgumentResolver> resolvers = invocable.getResolvers();

	AtomicInteger index = new AtomicInteger(-1);
	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestParamMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CookieValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ExpressionValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(SessionAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(ContinuationHandlerMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ErrorsMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ServerWebExchangeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PrincipalMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(WebSessionMethodArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(CustomArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CustomSyncArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
}
 
@Test
public void exceptionHandlerArgumentResolvers() {
	InvocableHandlerMethod invocable = this.methodResolver.getExceptionHandlerMethod(
			new ResponseStatusException(HttpStatus.BAD_REQUEST, "reason"), this.handlerMethod);

	assertNotNull("No match", invocable);
	assertEquals(TestController.class, invocable.getBeanType());
	List<HandlerMethodArgumentResolver> resolvers = invocable.getResolvers();

	AtomicInteger index = new AtomicInteger(-1);
	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestParamMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CookieValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ExpressionValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(SessionAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(ContinuationHandlerMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ServerWebExchangeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PrincipalMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(WebSessionMethodArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(CustomArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CustomSyncArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
}
 
@Test
public void requestMappingArgumentResolvers() {
	InvocableHandlerMethod invocable = this.methodResolver.getRequestMappingMethod(this.handlerMethod);
	List<HandlerMethodArgumentResolver> resolvers = invocable.getResolvers();

	AtomicInteger index = new AtomicInteger(-1);
	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestParamMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestBodyArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestPartMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CookieValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ExpressionValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(SessionAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(HttpEntityArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ErrorsMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ServerWebExchangeArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PrincipalArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(SessionStatusMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(WebSessionArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(CustomArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CustomSyncArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
}
 
@Test
public void modelAttributeArgumentResolvers() {
	List<InvocableHandlerMethod> methods = this.methodResolver.getModelAttributeMethods(this.handlerMethod);

	assertEquals("Expected one each from Controller + ControllerAdvice", 2, methods.size());
	InvocableHandlerMethod invocable = methods.get(0);
	List<HandlerMethodArgumentResolver> resolvers = invocable.getResolvers();

	AtomicInteger index = new AtomicInteger(-1);
	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestParamMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CookieValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ExpressionValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(SessionAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(ModelArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ErrorsMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ServerWebExchangeArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PrincipalArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(WebSessionArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(CustomArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CustomSyncArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ModelAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
}
 
@Test
public void exceptionHandlerArgumentResolvers() {
	InvocableHandlerMethod invocable = this.methodResolver.getExceptionHandlerMethod(
			new ResponseStatusException(HttpStatus.BAD_REQUEST, "reason"), this.handlerMethod);

	assertNotNull("No match", invocable);
	assertEquals(TestController.class, invocable.getBeanType());
	List<HandlerMethodArgumentResolver> resolvers = invocable.getResolvers();

	AtomicInteger index = new AtomicInteger(-1);
	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestParamMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PathVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(MatrixVariableMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestHeaderMapMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CookieValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ExpressionValueMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(SessionAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(RequestAttributeMethodArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(ModelArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(ServerWebExchangeArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(PrincipalArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(WebSessionArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(CustomArgumentResolver.class, next(resolvers, index).getClass());
	assertEquals(CustomSyncArgumentResolver.class, next(resolvers, index).getClass());

	assertEquals(RequestParamMethodArgumentResolver.class, next(resolvers, index).getClass());
}
 
源代码7 项目: spring-fu   文件: ReactiveWebServerInitializer.java
@Override
public void initialize(GenericApplicationContext context) {
	context.registerBean("webServerFactoryCustomizerBeanPostProcessor", WebServerFactoryCustomizerBeanPostProcessor.class, WebServerFactoryCustomizerBeanPostProcessor::new);

	context.registerBean(ReactiveWebServerFactoryCustomizer.class, () -> new ReactiveWebServerFactoryCustomizer(this.serverProperties));
	context.registerBean(ConfigurableReactiveWebServerFactory.class, () -> serverFactory);
	//noinspection deprecation
	context.registerBean(ErrorAttributes.class, () -> new DefaultErrorAttributes(serverProperties.getError().isIncludeException()));
	context.registerBean(ErrorWebExceptionHandler.class,  () -> {
		ErrorWebFluxAutoConfiguration errorConfiguration = new ErrorWebFluxAutoConfiguration(this.serverProperties);
		return errorConfiguration.errorWebExceptionHandler(context.getBean(ErrorAttributes.class), this.resourceProperties, context.getBeanProvider(ViewResolver.class), context.getBean(SERVER_CODEC_CONFIGURER_BEAN_NAME, ServerCodecConfigurer.class), context);
	});
	context.registerBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class, () -> new EnableWebFluxConfigurationWrapper(context, webFluxProperties));
	context.registerBean(LOCALE_CONTEXT_RESOLVER_BEAN_NAME, LocaleContextResolver.class, () -> context.getBean(EnableWebFluxConfigurationWrapper.class).localeContextResolver());
	context.registerBean("responseStatusExceptionHandler", WebExceptionHandler.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).responseStatusExceptionHandler());

	context.registerBean(RouterFunctionMapping.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).routerFunctionMapping(context.getBean(SERVER_CODEC_CONFIGURER_BEAN_NAME, ServerCodecConfigurer.class)));
	context.registerBean(SERVER_CODEC_CONFIGURER_BEAN_NAME, ServerCodecConfigurer.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).serverCodecConfigurer());
	context.registerBean("webFluxAdapterRegistry", ReactiveAdapterRegistry.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).webFluxAdapterRegistry());
	context.registerBean("handlerFunctionAdapter", HandlerFunctionAdapter.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).handlerFunctionAdapter());
	context.registerBean("webFluxContentTypeResolver", RequestedContentTypeResolver.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).webFluxContentTypeResolver());
	context.registerBean("webFluxConversionService", FormattingConversionService.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).webFluxConversionService());
	context.registerBean("serverResponseResultHandler", ServerResponseResultHandler.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).serverResponseResultHandler(context.getBean(SERVER_CODEC_CONFIGURER_BEAN_NAME, ServerCodecConfigurer.class)));
	context.registerBean("simpleHandlerAdapter", SimpleHandlerAdapter.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).simpleHandlerAdapter());
	context.registerBean("viewResolutionResultHandler", ViewResolutionResultHandler.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).viewResolutionResultHandler(context.getBean("webFluxAdapterRegistry", ReactiveAdapterRegistry.class), context.getBean("webFluxContentTypeResolver", RequestedContentTypeResolver.class)));
	context.registerBean("webFluxValidator", Validator.class, () -> context.getBean("fuWebFluxConfiguration", EnableWebFluxConfigurationWrapper.class).webFluxValidator());
	context.registerBean(HttpHandler.class, () -> applicationContext(context).build());
	context.registerBean(WEB_HANDLER_BEAN_NAME, DispatcherHandler.class, (Supplier<DispatcherHandler>) DispatcherHandler::new);
	context.registerBean(WebFluxConfig.class, () -> new WebFluxConfig(resourceProperties, webFluxProperties, context, context.getBeanProvider(HandlerMethodArgumentResolver.class), context.getBeanProvider(CodecCustomizer.class),
		context.getBeanProvider(ResourceHandlerRegistrationCustomizer.class), context.getBeanProvider(ViewResolver.class)));
}
 
private static List<HandlerMethodArgumentResolver> modelMethodResolvers(
		ArgumentResolverConfigurer customResolvers, ReactiveAdapterRegistry adapterRegistry,
		ConfigurableApplicationContext context) {

	return initResolvers(customResolvers, adapterRegistry, context, true, Collections.emptyList());
}
 
private static List<HandlerMethodArgumentResolver> requestMappingResolvers(
		ArgumentResolverConfigurer customResolvers, ReactiveAdapterRegistry adapterRegistry,
		ConfigurableApplicationContext context, List<HttpMessageReader<?>> readers) {

	return initResolvers(customResolvers, adapterRegistry, context, true, readers);
}
 
private static List<HandlerMethodArgumentResolver> exceptionHandlerResolvers(
		ArgumentResolverConfigurer customResolvers, ReactiveAdapterRegistry adapterRegistry,
		ConfigurableApplicationContext context) {

	return initResolvers(customResolvers, adapterRegistry, context, false, Collections.emptyList());
}
 
private static List<HandlerMethodArgumentResolver> initResolvers(ArgumentResolverConfigurer customResolvers,
		ReactiveAdapterRegistry adapterRegistry, ConfigurableApplicationContext context,
		boolean supportDataBinding, List<HttpMessageReader<?>> readers) {

	ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
	boolean requestMappingMethod = !readers.isEmpty() && supportDataBinding;

	// Annotation-based...
	List<HandlerMethodArgumentResolver> result = new ArrayList<>();
	result.add(new RequestParamMethodArgumentResolver(beanFactory, adapterRegistry, false));
	result.add(new RequestParamMapMethodArgumentResolver(adapterRegistry));
	result.add(new PathVariableMethodArgumentResolver(beanFactory, adapterRegistry));
	result.add(new PathVariableMapMethodArgumentResolver(adapterRegistry));
	result.add(new MatrixVariableMethodArgumentResolver(beanFactory, adapterRegistry));
	result.add(new MatrixVariableMapMethodArgumentResolver(adapterRegistry));
	if (!readers.isEmpty()) {
		result.add(new RequestBodyMethodArgumentResolver(readers, adapterRegistry));
		result.add(new RequestPartMethodArgumentResolver(readers, adapterRegistry));
	}
	if (supportDataBinding) {
		result.add(new ModelAttributeMethodArgumentResolver(adapterRegistry, false));
	}
	result.add(new RequestHeaderMethodArgumentResolver(beanFactory, adapterRegistry));
	result.add(new RequestHeaderMapMethodArgumentResolver(adapterRegistry));
	result.add(new CookieValueMethodArgumentResolver(beanFactory, adapterRegistry));
	result.add(new ExpressionValueMethodArgumentResolver(beanFactory, adapterRegistry));
	result.add(new SessionAttributeMethodArgumentResolver(beanFactory, adapterRegistry));
	result.add(new RequestAttributeMethodArgumentResolver(beanFactory, adapterRegistry));

	// Type-based...
	if (KotlinDetector.isKotlinPresent()) {
		result.add(new ContinuationHandlerMethodArgumentResolver());
	}
	if (!readers.isEmpty()) {
		result.add(new HttpEntityMethodArgumentResolver(readers, adapterRegistry));
	}
	result.add(new ModelMethodArgumentResolver(adapterRegistry));
	if (supportDataBinding) {
		result.add(new ErrorsMethodArgumentResolver(adapterRegistry));
	}
	result.add(new ServerWebExchangeMethodArgumentResolver(adapterRegistry));
	result.add(new PrincipalMethodArgumentResolver(adapterRegistry));
	if (requestMappingMethod) {
		result.add(new SessionStatusMethodArgumentResolver());
	}
	result.add(new WebSessionMethodArgumentResolver(adapterRegistry));

	// Custom...
	result.addAll(customResolvers.getCustomResolvers());

	// Catch-all...
	result.add(new RequestParamMethodArgumentResolver(beanFactory, adapterRegistry, true));
	if (supportDataBinding) {
		result.add(new ModelAttributeMethodArgumentResolver(adapterRegistry, true));
	}

	return result;
}
 
/**
 * Configure resolvers for custom controller method arguments.
 * @param resolver the resolver(s) to add
 */
public void addCustomResolver(HandlerMethodArgumentResolver... resolver) {
	Assert.notNull(resolver, "'resolvers' must not be null");
	this.customResolvers.addAll(Arrays.asList(resolver));
}
 
List<HandlerMethodArgumentResolver> getCustomResolvers() {
	return this.customResolvers;
}
 
private static HandlerMethodArgumentResolver next(
		List<? extends HandlerMethodArgumentResolver> resolvers, AtomicInteger index) {

	return resolvers.get(index.incrementAndGet());
}
 
private static List<HandlerMethodArgumentResolver> modelMethodResolvers(
		ArgumentResolverConfigurer customResolvers, ReactiveAdapterRegistry reactiveRegistry,
		ConfigurableApplicationContext context) {

	return initResolvers(customResolvers, reactiveRegistry, context, true, Collections.emptyList());
}
 
private static List<HandlerMethodArgumentResolver> requestMappingResolvers(
		ArgumentResolverConfigurer customResolvers, ReactiveAdapterRegistry reactiveRegistry,
		ConfigurableApplicationContext context, List<HttpMessageReader<?>> readers) {

	return initResolvers(customResolvers, reactiveRegistry, context, true, readers);
}
 
private static List<HandlerMethodArgumentResolver> exceptionHandlerResolvers(
		ArgumentResolverConfigurer customResolvers, ReactiveAdapterRegistry reactiveRegistry,
		ConfigurableApplicationContext context) {

	return initResolvers(customResolvers, reactiveRegistry, context, false, Collections.emptyList());
}
 
private static List<HandlerMethodArgumentResolver> initResolvers(ArgumentResolverConfigurer customResolvers,
		ReactiveAdapterRegistry reactiveRegistry, ConfigurableApplicationContext context,
		boolean supportDataBinding, List<HttpMessageReader<?>> readers) {

	ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
	boolean requestMappingMethod = !readers.isEmpty() && supportDataBinding;

	// Annotation-based...
	List<HandlerMethodArgumentResolver> result = new ArrayList<>();
	result.add(new RequestParamMethodArgumentResolver(beanFactory, reactiveRegistry, false));
	result.add(new RequestParamMapMethodArgumentResolver(reactiveRegistry));
	result.add(new PathVariableMethodArgumentResolver(beanFactory, reactiveRegistry));
	result.add(new PathVariableMapMethodArgumentResolver(reactiveRegistry));
	result.add(new MatrixVariableMethodArgumentResolver(beanFactory, reactiveRegistry));
	result.add(new MatrixVariableMapMethodArgumentResolver(reactiveRegistry));
	if (!readers.isEmpty()) {
		result.add(new RequestBodyArgumentResolver(readers, reactiveRegistry));
		result.add(new RequestPartMethodArgumentResolver(readers, reactiveRegistry));
	}
	if (supportDataBinding) {
		result.add(new ModelAttributeMethodArgumentResolver(reactiveRegistry, false));
	}
	result.add(new RequestHeaderMethodArgumentResolver(beanFactory, reactiveRegistry));
	result.add(new RequestHeaderMapMethodArgumentResolver(reactiveRegistry));
	result.add(new CookieValueMethodArgumentResolver(beanFactory, reactiveRegistry));
	result.add(new ExpressionValueMethodArgumentResolver(beanFactory, reactiveRegistry));
	result.add(new SessionAttributeMethodArgumentResolver(beanFactory, reactiveRegistry));
	result.add(new RequestAttributeMethodArgumentResolver(beanFactory, reactiveRegistry));

	// Type-based...
	if (!readers.isEmpty()) {
		result.add(new HttpEntityArgumentResolver(readers, reactiveRegistry));
	}
	result.add(new ModelArgumentResolver(reactiveRegistry));
	if (supportDataBinding) {
		result.add(new ErrorsMethodArgumentResolver(reactiveRegistry));
	}
	result.add(new ServerWebExchangeArgumentResolver(reactiveRegistry));
	result.add(new PrincipalArgumentResolver(reactiveRegistry));
	if (requestMappingMethod) {
		result.add(new SessionStatusMethodArgumentResolver());
	}
	result.add(new WebSessionArgumentResolver(reactiveRegistry));

	// Custom...
	result.addAll(customResolvers.getCustomResolvers());

	// Catch-all...
	result.add(new RequestParamMethodArgumentResolver(beanFactory, reactiveRegistry, true));
	if (supportDataBinding) {
		result.add(new ModelAttributeMethodArgumentResolver(reactiveRegistry, true));
	}

	return result;
}
 
/**
 * Configure resolvers for custom controller method arguments.
 * @param resolver the resolver(s) to add
 */
public void addCustomResolver(HandlerMethodArgumentResolver... resolver) {
	Assert.notNull(resolver, "'resolvers' must not be null");
	this.customResolvers.addAll(Arrays.asList(resolver));
}
 
List<HandlerMethodArgumentResolver> getCustomResolvers() {
	return this.customResolvers;
}
 
private static HandlerMethodArgumentResolver next(
		List<? extends HandlerMethodArgumentResolver> resolvers, AtomicInteger index) {

	return resolvers.get(index.incrementAndGet());
}