Spring 使用 Camel 2.25 启动 2.x : Spring 特定端点不工作
Spring boot 2.x with Camel 2.25 : Spring specific endpoints not working
我有一个带有 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>
我做错了什么吗?有什么建议吗?提前致谢。
这是因为你设置了 context-path: /* pattern means camel is going intercept (because this path is registered with camel) 它,在 spring 之前servlet 调度程序会处理它,所以如果你想处理 @Restcontroller 那么你需要为骆驼定义一个单独的上下文路径,例如: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;
}
或使用属性进行配置。
我有一个带有 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>
我做错了什么吗?有什么建议吗?提前致谢。
这是因为你设置了 context-path: /* pattern means camel is going intercept (because this path is registered with camel) 它,在 spring 之前servlet 调度程序会处理它,所以如果你想处理 @Restcontroller 那么你需要为骆驼定义一个单独的上下文路径,例如: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;
}
或使用属性进行配置。