2

我有一个带有 spring-boot 2.x 和 camel 2.25 的项目。它有不同的骆驼路线以及很少的 REST 消费者路线。到目前为止一切都很好。

现在我添加了一些带有一些端点的普通 spring-boot @RestController 类。但这些都不起作用(抛出 404)。

当我调查时发现,每个请求都来自 CamelServlet,它完全不知道基于 Spring 的普通 @RestController 端点(但只知道 Camel REST 消费者路由端点)。因此,仅针对 @RestController 端点抛出此错误,而 Camel REST 端点仍在工作。

下面是我的配置,

spring:
 application:
  name: gateway
 main:
  web-application-type: SERVLET 


server:
 servlet:
  context-path: /gateway
 port: 8080

camel:
 springboot:
  name: gateway
 component:
  servlet:
   mapping:
    enabled: true
    context-path: /*
  mail:
   basic-property-binding: true

下面是我的POM

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-servlet-starter</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-mail-starter</artifactId>
    </dependency>

有什么我做错了吗?有什么建议吗?提前致谢。

4

1 回答 1

3

这是因为你设置了context-path: / * 模式意味着骆驼要拦截它(因为这个路径是用骆驼注册的)它,在 spring servlet 调度程序处理它之前,所以如果你想处理@Restcontroller那么你需要定义一个单独的camel上下文路径,例如:context-path: camel-api/ * pattern,现在camel会注册camel-api base route,如果pattern和camel-api URL不同,会由spring-boot处理

@Bean
ServletRegistrationBean servletRegistrationBean() {
    ServletRegistrationBean servlet = new ServletRegistrationBean
      (new CamelHttpTransportServlet(), "camel-api/*");
    servlet.setName("CamelServlet");
    return servlet;
}

或使用属性进行配置。

于 2020-07-27T04:19:31.207 回答