Я использую Spring Boot 2.1.4.RELEASE.
У меня есть три модуля Gradle: приложение, интеграционный тест и веб.Приложение и интеграционный тест зависят от веба, веб зависит от библиотеки, которую я написал.Эта библиотека имеет следующий класс:
@Configuration
public class WebErrorAutoConfiguration {
@Bean
public CatchAllExceptionHandler catchAllExceptionHandler() {
return new CatchAllExceptionHandler();
}
@ConditionalOnBean(ErrorAttributes.class)
@Bean
public ErrorController errorController(ErrorAttributes errorAttributes) {
return new ErrorController(errorAttributes);
}
}
Данный класс включен в spring.factories.
Приложение @SpringBootApplication в модуле приложения развертывается нормально, а приложение @SpringBootApplication в модуле тестирования интеграции - нет.Ошибка:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'errorController' method
public org.springframework.http.ResponseEntity<?> com.sample.package.ErrorController.handleError(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
to { /error}: There is already 'basicErrorController' bean method
Я понимаю причину: мой экземпляр ErrorController не может быть создан, поскольку для / error уже определен обработчик.Я не понимаю, почему этого не происходит при развертывании приложения вне интеграционного теста.
Как Spring определяет порядок выполнения классов автоконфигурации?Я могу решить эту проблему, добавив @AutoConfigureBefore (ErrorMvcAutoConfiguration.class) в мой WebErrorAutoConfiguration.class, но я хотел бы понять разницу в поведении между обоими модулями.Я посмотрел на порядок jar-файлов, загруженных в ClassLoader, но моя библиотека загружается до Spring в обоих случаях.