【问题标题】:Spring boot AMQP and Spring Hadoop together ends up with missing EmbeddedServletContainerFactory beanSpring boot AMQP 和 Spring Hadoop 一起最终缺少 EmbeddedServletContainerFactory bean
【发布时间】:2016-04-27 03:27:49
【问题描述】:

我有两个小应用程序,一个使用spring-boot-starter-amqp,另一个使用spring-data-hadoop-boot。我可以毫无问题地单独运行它们。

当我将它们连接在一起时,应用启动失败并出现异常:org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean

我的主类非常通用,并且分别对它们都适用:

@PropertySource("file:conf/app.properties")
@SpringBootApplication
public class Job {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Job.class, args);
    }
}

我在这里迷路了。 AFAIK @SpringBootApplication 包含所需的所有注释,包括自动配置和组件扫描。我不需要配置 Web 环境,因为我没有使用它。当两个依赖项都在类路径中时,为什么我需要这样做,我该如何解决?

更新

我在 Spring Boot 代码中挖了一点。主要问题是SpringApplication.deduceWebEnvironment()会根据类路径中某些类的存在自动检测应该配置什么样的环境。

对于 web 环境,正在检查两个类。当它们都在类路径中时,会检测到需要正确配置的 Web 环境。

  • javax.servlet.Servlet
  • org.springframework.web.context.ConfigurableWebApplicationContext

spring-boot-starter-amqp:1.3.1.RELEASE 包含 ConfigurableWebApplicationContextspring-data-hadoop-boot:2.3.0.RELEASE-cdh5 包含 Servlet(在本机 Hadoop 库中)。

现在,当单独运行时,以上两种情况下都缺少一个类,导致未设置 Web 环境。

但是当我同时使用它们时 - 两个类都可以找到。检测到 Web 环境,误报,需要配置,而我无法(也不想)提供。

所以现在的问题是 - 我可以强制非 Web 环境,即使我在类路径中有这些类?或者有没有其他方法可以解决这个问题? (除了将它们从 Gradle 依赖项中排除)

【问题讨论】:

  • 您使用的是哪个 Spring Boot 版本?以及为什么要使用自定义属性文件,您可以简单地将属性添加到默认的application.properties。我怀疑其中一个依赖项会引入一些与 Web 相关的东西(可能是 hadoop),这会触发一些自动配置类。如果您真的不需要,可以将SpringApplication 上的web 属性设置为false。
  • 我故意移动了属性 - 这没有任何改变。但是您对自动配置的看法是正确的。

标签: spring-boot spring-amqp spring-data-hadoop


【解决方案1】:

解决了。

关注这个问题:How to prevent spring-boot autoconfiguration for spring-web?

我运行应用程序如下。

@PropertySource("file:conf/app.properties")
@SpringBootApplication
public class Job {
    public static void main(String[] args) throws Exception {
        new SpringApplicationBuilder(Job.class).web(false).run(args);
    }
}

上述问题的答案还建议使用属性spring.main.web_environment=false 或注释@EnableAutoConfiguration(exclude = WebMvcAutoConfiguration.class)。两种解决方案都对我不起作用。在我的情况下,只有编程解决方案才有效。

【讨论】:

  • 排除 WebMvcAutoConfiguration 不会阻止容器停止它只会禁用设置 web mvc 配置。您需要排除 EmbeddedServletContainerAutoConfiguration。设置该属性将不起作用,因为它没有被处理,因此请像现在一样排除或将 web 设置为 false。
猜你喜欢
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2014-07-28
  • 2014-08-30
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多