package org.springframework.issues; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.issues.supportingclasses.TestHandlerInterceptor; import org.springframework.issues.supportingclasses.TestHandlerMethodReturnValueHandler; import org.springframework.issues.supportingclasses.TestWebArgumentResolver; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.handler.HandlerExceptionResolverComposite; import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.ServletWebArgumentResolverAdapter; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.List; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration public class DelegatingWebMvcConfigurationWithOtherAutowiredDependenciesTests { @Autowired ApplicationContext context; @Configuration @EnableWebMvc static class Config { @Bean TestWebMvcConfigurer testWebMvcConfigurerWithContentNegotiationManager() { return new TestWebMvcConfigurer() { @Autowired ApplicationContext context; @Autowired @Lazy private ContentNegotiationManager contentNegotiationManager; @Autowired @Lazy private RequestMappingHandlerAdapter requestMappingHandlerAdapter; @Autowired @Lazy private HandlerExceptionResolver handlerExceptionResolver; @Autowired(required = false) private List<HttpMessageConverter<?>> httpMessageConverters; private final HandlerMethodArgumentResolver testWebArgumentResolver = new ServletWebArgumentResolverAdapter(new TestWebArgumentResolver()); /** * Using @Lazy initialization in the autowired dependencies above, this test * looks to make sure all of the following methods get called. */ @Override public void addInterceptors(InterceptorRegistry interceptorRegistry) { interceptorRegistry.addInterceptor(new TestHandlerInterceptor()); super.addInterceptors(interceptorRegistry); } @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) { list.add(this.testWebArgumentResolver); super.addArgumentResolvers(list); } @Override public void configureContentNegotiation(ContentNegotiationConfigurer contentNegotiationConfigurer) { contentNegotiationConfigurer.defaultContentType(MediaType.APPLICATION_JSON); super.configureContentNegotiation(contentNegotiationConfigurer); } @PostConstruct public void testPostConstruct() { org.springframework.util.Assert.notNull(this.context, "context may not be null"); org.springframework.util.Assert.notNull(this.contentNegotiationManager, "contentNegotiationManager may not be null"); org.springframework.util.Assert.notNull(this.requestMappingHandlerAdapter, "requestMappingHandlerAdapter may not be null"); org.springframework.util.Assert.notNull(this.handlerExceptionResolver, "handlerExceptionResolver may not be null"); if (this.httpMessageConverters == null) { //For Non-Spring Boot Applications this.httpMessageConverters = this.requestMappingHandlerAdapter.getMessageConverters(); } org.springframework.util.Assert.notNull(httpMessageConverters, "httpMessageConverters may not be null"); //Add test returnValueHandler final TestHandlerMethodReturnValueHandler testHandlerMethodReturnValueHandler = new TestHandlerMethodReturnValueHandler(httpMessageConverters, contentNegotiationManager); final List<HandlerMethodReturnValueHandler> handlers = new ArrayList<HandlerMethodReturnValueHandler>(this.requestMappingHandlerAdapter.getReturnValueHandlers()); handlers.add(0, testHandlerMethodReturnValueHandler); this.requestMappingHandlerAdapter.setReturnValueHandlers(handlers); //Add test handlerExceptionResolver ExceptionHandlerExceptionResolver exceptionHandlerExceptionResolver = new ExceptionHandlerExceptionResolver(); exceptionHandlerExceptionResolver.setApplicationContext(this.context); exceptionHandlerExceptionResolver.setContentNegotiationManager(this.contentNegotiationManager); exceptionHandlerExceptionResolver.setCustomReturnValueHandlers(new ArrayList<HandlerMethodReturnValueHandler>() {{add(testHandlerMethodReturnValueHandler);}}); exceptionHandlerExceptionResolver.setMessageConverters(httpMessageConverters); exceptionHandlerExceptionResolver.setCustomArgumentResolvers(new ArrayList<HandlerMethodArgumentResolver>() {{ add(testWebArgumentResolver); }}); exceptionHandlerExceptionResolver.afterPropertiesSet(); HandlerExceptionResolverComposite handlerExceptionResolverComposite = (HandlerExceptionResolverComposite)this.handlerExceptionResolver; final List<HandlerExceptionResolver> exceptionResolvers = new ArrayList<HandlerExceptionResolver>(handlerExceptionResolverComposite.getExceptionResolvers()); exceptionResolvers.add(0, exceptionHandlerExceptionResolver); handlerExceptionResolverComposite.setExceptionResolvers(exceptionResolvers); } }; } } @Test public void testThatAllMethodsOnTestWebMvcConfigurerGotCalled() { TestWebMvcConfigurer testWebMvcConfigurer = context.getBean(TestWebMvcConfigurer.class); Assert.assertNotNull(testWebMvcConfigurer); Assert.assertEquals(testWebMvcConfigurer.getCallbackMethodsThatWereNotCalled(), TestWebMvcConfigurer.CALLBACK_METHOD_COUNT, testWebMvcConfigurer.getCounterValue()); } }