gpt4 book ai didi

java - 为什么自动配置类的顺序有差异?

转载 作者:行者123 更新时间:2023-12-02 05:47:44 24 4
gpt4 key购买 nike

我正在使用 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 来解决此问题,但我想了解两个模块之间行为的差异。我查看了 ClassLoader 中加载的 jar 的顺序,但在这两个实例中,我的库都是在 Spring 之前加载的。

最佳答案

Spring Boot 自动配置中的顺序是不同的,因为它们不能确保顺序,除非您放置像 @AutoConfigureBefore@AutoConfigureAfter 等注释。

当您没有指定它们时,它很大程度上取决于您的类路径(操作系统、环境、构建工具等之间可​​能有所不同)和 spring 读取模块列表的顺序。在每个环境中可能会略有不同,如果您想确保执行您想要的顺序,您需要指定顺序。

请注意,主应用程序中的任何内容(带有用 @SpringBootApplication 注释的类的包下的内容)将首先加载,然后再加载其他内容,并且提到的支持自动配置模块排序的注释确实如此不影响这些配置。

关于java - 为什么自动配置类的顺序有差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56079854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com