Программная регистрация WebMvcConfigurationSupport вместо @Configuration

[Этот вопрос похож на «Предотвращение @ Аннотированный класс 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, но я хочу знать, что происходит.


person stolsvik    schedule 06.03.2014    source источник
comment
@SotiriosDelimanolis: Ссылка вместе с комментарием - или на самом деле ответ - были бы очень признательны!   -  person stolsvik    schedule 20.03.2014


Ответы (1)


Попробуйте следующее: добавьте в свои классы интеграционных тестов аннотации @WebAppConfiguration. Это создаст mock ServletContext для настройки Spring MVC.

person holmis83    schedule 06.03.2014