[Этот вопрос похож на «Предотвращение @ Аннотированный класс EnableWebMvc не был обнаружен @ComponentScan ", только с другим вектором атаки по сравнению с проблемой, с которой у меня возникла проблема в Spring 4]
Поскольку @ComponentScan находит все экземпляры @Configuration, он также подбирает мое расширение WebMvcConfigurationSupport, которое я хочу в среде сервлетов. Но в режиме тестирования интеграции я этого не хочу, поскольку он жалуется на отсутствие ServletContext.
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99) at ... Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling at org.springframework.util.Assert.notNull(Assert.java:112) at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.(DefaultServletHandlerConfigurer.java:54) at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:329) at ...
Раньше я исправлял это, вместо того, чтобы позволять его находить с помощью @ComponentScan, также имея аннотацию @Configuration, я напрямую включаю ее, используя AnnotationConfigWebApplicationContext.register (thatClass), код, который не запускается во время настройки интеграционного теста.
Это работало нормально, пока я не обновился до Spring 4.0.2, где я получил новое исключение из класса 4.0 CompositeUriComponentsContributor:
Caused by: java.lang.IllegalArgumentException: 'uriComponentsContributors' must not be null at org.springframework.util.Assert.notNull(Assert.java:112) ~[spring-core-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.web.method.support.CompositeUriComponentsContributor.(CompositeUriComponentsContributor.java:88) ~[spring-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.mvcUriComponentsContributor(WebMvcConfigurationSupport.java:573) ~[spring-webmvc-4.0.2.RELEASE.jar:4.0.2.RELEASE] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_51] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_51] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_51] at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_51] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166) ~[spring-beans-4.0.2.RELEASE.jar:4.0.2.RELEASE] ... 34 common frames omitted
Таким образом, очевидно, что теперь по какой-то причине это должно быть «@ Configuration-found», а не включаться при вызове регистра.
Это почему? Как я могу это исправить? Я понимаю, что могу убрать его с «пути» @ComponentScan, но я хочу знать, что происходит.