You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让基于Apache Camel Jetty的最简SpringBoot服务正常运行?

如何让基于Apache Camel Jetty的最简SpringBoot服务正常运行?

嘿,我来帮你梳理下问题所在,其实你现在的代码有几个关键小错误,调整一下就能正常跑起来了:

首先,先揪出核心问题

  1. RouteBuilder写法错了:你直接把from(...)写在类体里,这根本不会被执行!Camel的路由必须定义在configure()方法里,而且要重写这个方法才行。
  2. 依赖冗余且冲突:你同时加了spring-boot-starter-web(默认带Tomcat)和Camel Jetty组件,这俩会抢Web容器的控制权;而且camel-servlet-starter、camel-jetty这些都是多余的,和camel-jetty-starter功能重叠。
  3. 启动类配置不对:你把myRouteBuilder直接传给SpringApplication,这不是正确的启动姿势——应该启动你自己的RestServiceApplication类,它才是Spring Boot的入口。

接下来一步步修正

1. 修复你的RouteBuilder类

把路由逻辑移到configure()方法里,同时类名要符合Java规范(首字母大写):

@Component
public class MyRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        // 定义Jetty端点和路由逻辑
        from("jetty:http://0.0.0.0:8080/")
            .log("Request received.")
            .setBody(simple("Huhu y'all!"));
    }
}

2. 清理POM依赖

删掉冲突和冗余的依赖,只保留最必要的:

<dependencies>
    <!-- Camel嵌入式Jetty的Starter,已经包含所有Jetty相关功能 -->
    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-jetty-starter</artifactId>
        <!-- 注意:这里要填和你Spring Boot版本匹配的Camel版本,比如Spring Boot 2.7.x对应Camel 3.20.x -->
        <version>3.20.2</version>
    </dependency>
    
    <!-- Spring Boot核心Starter,不需要带web的版本(避免引入Tomcat) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>

为什么删掉spring-boot-starter-web?因为它默认会引入Tomcat,和我们要用的Camel Jetty嵌入式容器冲突,我们完全可以靠Camel自己的Jetty来处理HTTP请求。

3. 修正Spring Boot启动类

启动入口要指向你自己的RestServiceApplication,同时设置WebApplicationType.NONE告诉Spring不要启动自带的Web容器:

@SpringBootApplication
public class RestServiceApplication {

    private static CountDownLatch stopLatch = null;

    public static void main(String[] args) {
        // 启动自己的Spring Boot应用类,而不是RouteBuilder
        SpringApplication theApp = new SpringApplication(RestServiceApplication.class);
        // 禁用Spring自带的Web容器,因为我们用Camel的Jetty
        theApp.setWebApplicationType(WebApplicationType.NONE);

        try {
            ConfigurableApplicationContext appContext = theApp.run(args);
            appContext.registerShutdownHook();
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        stopLatch = new CountDownLatch(1);
        try {
            stopLatch.await();
        } catch (InterruptedException e) {
            // 处理中断信号
            Thread.currentThread().interrupt();
        }
    }
}

最后测试

启动应用后,在终端执行curl http://localhost:8080/,你应该能收到返回的Huhu y'all!,同时控制台会打印Request received.的日志,完美运行~

额外注意点

  • 一定要保证Camel和Spring Boot的版本兼容,比如Camel 3.x对应Spring Boot 2.x,Camel 4.x对应Spring Boot 3.x,版本不匹配容易出奇怪的问题。
  • 不要同时混用Spring的Web容器和Camel的Jetty容器,二选一就行。

备注:内容来源于stack exchange,提问作者WolfiG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:04:34