java 应用程序因同一Bean而无法启动

6mzjoqzu  于 2023-03-11  发布在  Java
关注(0)|答案(3)|浏览(210)

我有一个Spring Webflux应用程序,尝试从旧模块(旧模块位于Spring WebMVC框架上)加载依赖项。
当应用程序启动时,将抛出此错误-

***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'requestMappingHandlerAdapter', defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [org/springframework/web/reactive/config/DelegatingWebFluxConfiguration.class] and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

我想启动webflux包中的所有bean,所以我不能设置spring.main.allow-bean-definition-overriding=true
还尝试在组件扫描时排除org.springframework. Boot 中的所有类-@ComponentScan(excludeFilters = @Filter(type = FilterType.REGEX, pattern = "org.springframework.boot*")。还尝试排除webflux项目的pom.xml中的所有Spring包,如下所示-

<exclusion>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
</exclusion>

既然我不能修改旧的依赖项目到webflux,有没有什么选项可以让代码工作?

g2ieeal7

g2ieeal71#

在Sping Boot 启动类中,@EnableAutoConfiguration注解将自动配置MVC部件(由于DelegatingWebFluxConfiguration中的bean名称相同,WebMvcAutoConfiguration将失败)
因此,尝试从自动配置中排除此选项,如下所示:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {WebMvcAutoConfiguration.class })
public static void main(String[] args) {
    ...
    SpringApplication.run(MyApp.class, args);
}
ocebsuys

ocebsuys2#

如果我的理解正确,您在类路径上有一些与Web相关的依赖项,但是没有构建Web应用程序,那么您可以显式地告诉SpringApplication您不需要Web应用程序:

app.setWebEnvironment(false);

这是禁用Web相关的自动配置的方法,因为这意味着您不需要知道这些自动配置类是什么,并且让Sping Boot 来为您处理。

z31licg0

z31licg03#

正如您在问题描述中提到的,在Spring Webflux中使用Spring MVC的依赖项可能会导致这个问题。我已经通过排除组“org.springframework. Boot ”而包含旧的依赖项来解决这个问题。
在www.example.com中gradle.build我做了如下操作:

implementation("dependency-using-spring-mvc") {
    exclude(group= "org.springframework.boot")
}

相关问题