Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid calling other bean methods in web config #22596

Merged
merged 1 commit into from
Apr 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.servlet.resource.ResourceUrlProvider;
import org.springframework.web.servlet.support.SessionFlashMapManager;
import org.springframework.web.servlet.theme.FixedThemeResolver;
import org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator;
Expand Down Expand Up @@ -374,23 +375,33 @@ private void registerMvcSingletons(StubWebApplicationContext wac) {
wac.addBeans(this.controllers);
wac.addBeans(this.controllerAdvice);

RequestMappingHandlerMapping hm = config.getHandlerMapping();
FormattingConversionService mvcConversionService = config.mvcConversionService();
wac.addBean("mvcConversionService", mvcConversionService);
ResourceUrlProvider resourceUrlProvider = config.mvcResourceUrlProvider();
wac.addBean("mvcResourceUrlProvider", resourceUrlProvider);
ContentNegotiationManager mvcContentNegotiationManager = config.mvcContentNegotiationManager();
wac.addBean("mvcContentNegotiationManager", mvcContentNegotiationManager);
Validator mvcValidator = config.mvcValidator();
wac.addBean("mvcValidator", mvcValidator);

RequestMappingHandlerMapping hm = config.getHandlerMapping(mvcConversionService, resourceUrlProvider);
if (sc != null) {
hm.setServletContext(sc);
}
hm.setApplicationContext(wac);
hm.afterPropertiesSet();
wac.addBean("requestMappingHandlerMapping", hm);

RequestMappingHandlerAdapter ha = config.requestMappingHandlerAdapter();
RequestMappingHandlerAdapter ha = config.requestMappingHandlerAdapter(mvcContentNegotiationManager,
mvcConversionService, mvcValidator);
if (sc != null) {
ha.setServletContext(sc);
}
ha.setApplicationContext(wac);
ha.afterPropertiesSet();
wac.addBean("requestMappingHandlerAdapter", ha);

wac.addBean("handlerExceptionResolver", config.handlerExceptionResolver());
wac.addBean("handlerExceptionResolver", config.handlerExceptionResolver(mvcContentNegotiationManager));

wac.addBeans(initViewResolvers(wac));
wac.addBean(DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME, this.localeResolver);
Expand Down Expand Up @@ -430,13 +441,15 @@ protected Map<String, Object> extendMvcSingletons(@Nullable ServletContext servl
/** Using the MVC Java configuration as the starting point for the "standalone" setup. */
private class StandaloneConfiguration extends WebMvcConfigurationSupport {

public RequestMappingHandlerMapping getHandlerMapping() {
public RequestMappingHandlerMapping getHandlerMapping(
FormattingConversionService mvcConversionService,
ResourceUrlProvider mvcResourceUrlProvider) {
RequestMappingHandlerMapping handlerMapping = handlerMappingFactory.get();
handlerMapping.setEmbeddedValueResolver(new StaticStringValueResolver(placeholderValues));
handlerMapping.setUseSuffixPatternMatch(useSuffixPatternMatch);
handlerMapping.setUseTrailingSlashMatch(useTrailingSlashPatternMatch);
handlerMapping.setOrder(0);
handlerMapping.setInterceptors(getInterceptors());
handlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
if (removeSemicolonContent != null) {
handlerMapping.setRemoveSemicolonContent(removeSemicolonContent);
}
Expand Down Expand Up @@ -506,7 +519,7 @@ protected void configureHandlerExceptionResolvers(List<HandlerExceptionResolver>
}
for (HandlerExceptionResolver resolver : handlerExceptionResolvers) {
if (resolver instanceof ApplicationContextAware) {
ApplicationContext applicationContext = getApplicationContext();
ApplicationContext applicationContext = getApplicationContext();
if (applicationContext != null) {
((ApplicationContextAware) resolver).setApplicationContext(applicationContext);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -92,6 +92,10 @@ public class WebFluxConfigurationSupport implements ApplicationContextAware {
@Nullable
private ApplicationContext applicationContext;

@Nullable
public final ApplicationContext getApplicationContext() {
return this.applicationContext;
}

@Override
public void setApplicationContext(@Nullable ApplicationContext applicationContext) {
Expand All @@ -103,12 +107,6 @@ public void setApplicationContext(@Nullable ApplicationContext applicationContex
}
}

@Nullable
public final ApplicationContext getApplicationContext() {
return this.applicationContext;
}


@Bean
public DispatcherHandler webHandler() {
return new DispatcherHandler();
Expand All @@ -121,10 +119,11 @@ public WebExceptionHandler responseStatusExceptionHandler() {
}

@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
public RequestMappingHandlerMapping requestMappingHandlerMapping(
RequestedContentTypeResolver webFluxContentTypeResolver) {
RequestMappingHandlerMapping mapping = createRequestMappingHandlerMapping();
mapping.setOrder(0);
mapping.setContentTypeResolver(webFluxContentTypeResolver());
mapping.setContentTypeResolver(webFluxContentTypeResolver);
mapping.setCorsConfigurations(getCorsConfigurations());

PathMatchConfigurer configurer = getPathMatchConfigurer();
Expand Down Expand Up @@ -203,10 +202,10 @@ public void configurePathMatching(PathMatchConfigurer configurer) {
}

@Bean
public RouterFunctionMapping routerFunctionMapping() {
public RouterFunctionMapping routerFunctionMapping(ServerCodecConfigurer serverCodecConfigurer) {
RouterFunctionMapping mapping = createRouterFunctionMapping();
mapping.setOrder(-1); // go before RequestMappingHandlerMapping
mapping.setMessageReaders(serverCodecConfigurer().getReaders());
mapping.setMessageReaders(serverCodecConfigurer.getReaders());
mapping.setCorsConfigurations(getCorsConfigurations());

return mapping;
Expand All @@ -225,13 +224,13 @@ protected RouterFunctionMapping createRouterFunctionMapping() {
* {@link #addResourceHandlers}.
*/
@Bean
public HandlerMapping resourceHandlerMapping() {
public HandlerMapping resourceHandlerMapping(ResourceUrlProvider resourceUrlProvider) {
ResourceLoader resourceLoader = this.applicationContext;
if (resourceLoader == null) {
resourceLoader = new DefaultResourceLoader();
}
ResourceHandlerRegistry registry = new ResourceHandlerRegistry(resourceLoader);
registry.setResourceUrlProvider(resourceUrlProvider());
registry.setResourceUrlProvider(resourceUrlProvider);
addResourceHandlers(registry);

AbstractHandlerMapping handlerMapping = registry.getHandlerMapping();
Expand Down Expand Up @@ -265,11 +264,15 @@ protected void addResourceHandlers(ResourceHandlerRegistry registry) {
}

@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
public RequestMappingHandlerAdapter requestMappingHandlerAdapter(
ReactiveAdapterRegistry webFluxAdapterRegistry,
ServerCodecConfigurer serverCodecConfigurer,
FormattingConversionService webFluxConversionService,
Validator webfluxValidator) {
RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter();
adapter.setMessageReaders(serverCodecConfigurer().getReaders());
adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer());
adapter.setReactiveAdapterRegistry(webFluxAdapterRegistry());
adapter.setMessageReaders(serverCodecConfigurer.getReaders());
adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer(webFluxConversionService, webfluxValidator));
adapter.setReactiveAdapterRegistry(webFluxAdapterRegistry);

ArgumentResolverConfigurer configurer = new ArgumentResolverConfigurer();
configureArgumentResolvers(configurer);
Expand Down Expand Up @@ -325,10 +328,12 @@ protected void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
* Return the {@link ConfigurableWebBindingInitializer} to use for
* initializing all {@link WebDataBinder} instances.
*/
protected ConfigurableWebBindingInitializer getConfigurableWebBindingInitializer() {
protected ConfigurableWebBindingInitializer getConfigurableWebBindingInitializer(
FormattingConversionService webFluxConversionService,
Validator webFluxValidator) {
ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
initializer.setConversionService(webFluxConversionService());
initializer.setValidator(webFluxValidator());
initializer.setConversionService(webFluxConversionService);
initializer.setValidator(webFluxValidator);
MessageCodesResolver messageCodesResolver = getMessageCodesResolver();
if (messageCodesResolver != null) {
initializer.setMessageCodesResolver(messageCodesResolver);
Expand Down Expand Up @@ -420,33 +425,42 @@ public SimpleHandlerAdapter simpleHandlerAdapter() {
}

@Bean
public ResponseEntityResultHandler responseEntityResultHandler() {
return new ResponseEntityResultHandler(serverCodecConfigurer().getWriters(),
webFluxContentTypeResolver(), webFluxAdapterRegistry());
public ResponseEntityResultHandler responseEntityResultHandler(
ReactiveAdapterRegistry webFluxAdapterRegistry,
ServerCodecConfigurer serverCodecConfigurer,
RequestedContentTypeResolver webFluxContentTypeResolver) {
return new ResponseEntityResultHandler(serverCodecConfigurer.getWriters(),
webFluxContentTypeResolver, webFluxAdapterRegistry);
}

@Bean
public ResponseBodyResultHandler responseBodyResultHandler() {
return new ResponseBodyResultHandler(serverCodecConfigurer().getWriters(),
webFluxContentTypeResolver(), webFluxAdapterRegistry());
public ResponseBodyResultHandler responseBodyResultHandler(
ReactiveAdapterRegistry webFluxAdapterRegistry,
ServerCodecConfigurer serverCodecConfigurer,
RequestedContentTypeResolver webFluxContentTypeResolver) {
return new ResponseBodyResultHandler(serverCodecConfigurer.getWriters(),
webFluxContentTypeResolver, webFluxAdapterRegistry);
}

@Bean
public ViewResolutionResultHandler viewResolutionResultHandler() {
public ViewResolutionResultHandler viewResolutionResultHandler(
ReactiveAdapterRegistry webFluxAdapterRegistry,
RequestedContentTypeResolver webFluxContentTypeResolver) {
ViewResolverRegistry registry = getViewResolverRegistry();
List<ViewResolver> resolvers = registry.getViewResolvers();
ViewResolutionResultHandler handler = new ViewResolutionResultHandler(
resolvers, webFluxContentTypeResolver(), webFluxAdapterRegistry());
resolvers, webFluxContentTypeResolver, webFluxAdapterRegistry);
handler.setDefaultViews(registry.getDefaultViews());
handler.setOrder(registry.getOrder());
return handler;
}

@Bean
public ServerResponseResultHandler serverResponseResultHandler() {
public ServerResponseResultHandler serverResponseResultHandler(
ServerCodecConfigurer serverCodecConfigurer) {
List<ViewResolver> resolvers = getViewResolverRegistry().getViewResolvers();
ServerResponseResultHandler handler = new ServerResponseResultHandler();
handler.setMessageWriters(serverCodecConfigurer().getWriters());
handler.setMessageWriters(serverCodecConfigurer.getWriters());
handler.setViewResolvers(resolvers);
return handler;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -27,9 +27,12 @@
import org.mockito.MockitoAnnotations;

import org.springframework.context.support.StaticApplicationContext;
import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.http.codec.HttpMessageWriter;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import org.springframework.web.reactive.accept.RequestedContentTypeResolverBuilder;
Expand Down Expand Up @@ -72,7 +75,7 @@ public void setup() {
@Test
public void requestMappingHandlerMapping() throws Exception {
delegatingConfig.setConfigurers(Collections.singletonList(webFluxConfigurer));
delegatingConfig.requestMappingHandlerMapping();
delegatingConfig.requestMappingHandlerMapping(delegatingConfig.webFluxContentTypeResolver());

verify(webFluxConfigurer).configureContentTypeResolver(any(RequestedContentTypeResolverBuilder.class));
verify(webFluxConfigurer).addCorsMappings(any(CorsRegistry.class));
Expand All @@ -82,9 +85,14 @@ public void requestMappingHandlerMapping() throws Exception {
@Test
public void requestMappingHandlerAdapter() throws Exception {
delegatingConfig.setConfigurers(Collections.singletonList(webFluxConfigurer));
ReactiveAdapterRegistry reactiveAdapterRegistry = delegatingConfig.webFluxAdapterRegistry();
ServerCodecConfigurer serverCodecConfigurer = delegatingConfig.serverCodecConfigurer();
FormattingConversionService formattingConversionService = delegatingConfig.webFluxConversionService();
Validator validator = delegatingConfig.webFluxValidator();

ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer)
this.delegatingConfig.requestMappingHandlerAdapter().getWebBindingInitializer();
this.delegatingConfig.requestMappingHandlerAdapter(reactiveAdapterRegistry, serverCodecConfigurer,
formattingConversionService, validator).getWebBindingInitializer();

verify(webFluxConfigurer).configureHttpMessageCodecs(codecsConfigurer.capture());
verify(webFluxConfigurer).getValidator();
Expand All @@ -107,15 +115,18 @@ public void resourceHandlerMapping() throws Exception {
return null;
}).when(webFluxConfigurer).addResourceHandlers(any(ResourceHandlerRegistry.class));

delegatingConfig.resourceHandlerMapping();
delegatingConfig.resourceHandlerMapping(delegatingConfig.resourceUrlProvider());
verify(webFluxConfigurer).addResourceHandlers(any(ResourceHandlerRegistry.class));
verify(webFluxConfigurer).configurePathMatching(any(PathMatchConfigurer.class));
}

@Test
public void responseBodyResultHandler() throws Exception {
delegatingConfig.setConfigurers(Collections.singletonList(webFluxConfigurer));
delegatingConfig.responseBodyResultHandler();
delegatingConfig.responseBodyResultHandler(
delegatingConfig.webFluxAdapterRegistry(),
delegatingConfig.serverCodecConfigurer(),
delegatingConfig.webFluxContentTypeResolver());

verify(webFluxConfigurer).configureHttpMessageCodecs(codecsConfigurer.capture());
verify(webFluxConfigurer).configureContentTypeResolver(any(RequestedContentTypeResolverBuilder.class));
Expand All @@ -124,7 +135,8 @@ public void responseBodyResultHandler() throws Exception {
@Test
public void viewResolutionResultHandler() throws Exception {
delegatingConfig.setConfigurers(Collections.singletonList(webFluxConfigurer));
delegatingConfig.viewResolutionResultHandler();
delegatingConfig.viewResolutionResultHandler(delegatingConfig.webFluxAdapterRegistry(),
delegatingConfig.webFluxContentTypeResolver());

verify(webFluxConfigurer).configureViewResolvers(any(ViewResolverRegistry.class));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Loading