Почему есть разница в порядке классов автоконфигурации? - PullRequest
0 голосов
/ 10 мая 2019

Я использую 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 в обоих случаях.

1 Ответ

0 голосов
/ 10 мая 2019

Порядок автоматической настройки при весенней загрузке отличается, поскольку они не обеспечивают порядок, если вы не разместите аннотации, такие как @AutoConfigureBefore, @AutoConfigureAfter и т. Д.

Когда вы не указываете их, это в значительной степени основано на вашем пути к классам (может отличаться в зависимости от ОС, env, build-tools и т. Д.) И порядке упорядочения чтения списка модулей. В каждой среде он может немного отличаться, и если вы хотите убедиться, что требуемый заказ выполнен, вам необходимо указать порядок.

Обратите внимание, что все в вашем главном приложении (то, что находится в пакете с классом, помеченным @SpringBootApplication) будет загружаться в первую очередь, прежде чем все остальное, и упомянутые аннотации, поддерживающие упорядочение модулей автоконфигурации, не влияют на эти конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...