Spring Boot + Apache Camel HTTP组件在启动时崩溃:缺少EmbeddedServletContainerFactory bean

时间:2014-01-19 22:43:34

标签: spring apache-camel spring-boot

刚刚使用Spring-Boot进行旋转并决定混合使用Camel,因为我需要一些神秘的Headers在我正在处理的其他客户端中工作。设置应用程序很好,直到我将camel-http组件添加到我的POM,然后我在init上得到这个:

Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

我还没有第一个想到从哪里开始寻找问题的想法。我收集Spring Boot将查找类路径并尝试连接东西,那么有没有办法阻止Camel包被采取行动或类似的东西?

在此Gist

中完成启动日志

这是我的主要应用代码:

@ComponentScan
@EnableAutoConfiguration
public class Application {

    private static ApplicationContext ctx;

    public static void main(String[] args) throws Exception {
        ctx = SpringApplication.run(Application.class, args);

        //Right outta Spring 4 docs
        System.out.println("Let's inspect the beans provided by Spring Boot:");
        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {
            System.out.println(beanName);
        }
        //---

        // FIXME: ugly hack to allow some POC woek while wait for proper Camel/Spring4 unit tests fix.
        Application app = new Application();
        app.executeTests();

    }

    /**
     * Dev QOL - unit tests are broken for now, see:
     * https://issues.apache.org/jira/browse/CAMEL-7074
     * <p/>
     * Waiting for fix (Too lay to checkout and build my own Camel)
     */
    private void executeTests() throws Exception {
        testAuth();
    }

    @Bean
    DefaultCamelContext camelCtx() throws Exception {
        DefaultCamelContext camel = new DefaultCamelContext();
        camel.addRoutes(cryptsyRouteBuilder());
        camel.start();
        return camel;
    }

    @Bean
    public CryptsyRouteBuilder cryptsyRouteBuilder() throws Exception{
        CryptsyRouteBuilder bean = new CryptsyRouteBuilder();
        bean.setCryptsy(cryptsy());
        return bean;
    }

    @Bean
    public Cryptsy cryptsy() throws IOException {
        return new Cryptsy();
    }

    protected void testAuth() throws Exception {
        ProducerTemplate producer = camelCtx().createProducerTemplate();
        producer.requestBody("direct:start", "Why, hullo there", String.class);
    }


}

我的POM依赖项:

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>0.5.0.BUILD-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-actuator</artifactId>-->
        <!--</dependency>-->

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>

        <!-- Camel -->
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
            <version>${camel.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-spring</artifactId>
            <version>${camel.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-spring-javaconfig</artifactId>
            <version>${camel.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-quartz</artifactId>
            <version>${camel.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-test-spring</artifactId>
            <version>${camel.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-http</artifactId>
            <version>${camel.version}</version>
        </dependency>

        <!-- Assorted -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.3.0</version>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>

    </dependencies>


    <properties>
        <start-class>xxx.xxxx.Application</start-class>
        <camel.version>2.12.2</camel.version>
    </properties>

1 个答案:

答案 0 :(得分:5)

异常告诉您Spring Boot认为您要构建Web服务器,但无法在类路径上找到正确的依赖项。在您的情况下,最明显的原因是您添加的HTTP依赖项包括Servlet API。我认为没有理由为客户端应用程序需要它,但只有你知道是否需要它。也许你可以排除它?

如果您确实需要Servlet依赖项,并且只想明确告诉Boot您没有创建Web应用程序,则可以设置属性spring.main.web_environment=false,或使用SpringApplication(或{{1 API)直接设置相同的标志。有关背景信息,请参阅docs here