Spring Boot Camel POST端点404 Not Found问题排查求助
问题描述
我正在开发基于Spring Boot 3.2.4、Camel 4.3.0、Java 17的项目,已配置REST POST路由,但通过cURL或Postman访问http://localhost:5001/v1/test/api时返回404 Not Found,附上相关配置代码,请求协助解决该问题。
配置代码
@Configuration public class CamelWebConfiguration { private static final String CAMEL_URL_MAPPING = "/v1/*"; private static final String CAMEL_SERVLET_NAME = "CamelServlet"; private final RoutesConfiguration routesConfiguration; @Autowired public CamelWebConfiguration(RoutesConfiguration routesConfiguration) { this.routesConfiguration = routesConfiguration; } @Bean public ServletRegistrationBean<CamelHttpTransportServlet> servletRegistrationBean() throws Exception { ServletRegistrationBean<CamelHttpTransportServlet> registration = new ServletRegistrationBean<>(new CamelHttpTransportServlet(), CAMEL_URL_MAPPING); registration.setName(CAMEL_SERVLET_NAME); System.out.println("2222211111111111 " + registration.getUrlMappings()); routesConfiguration.configure(); return registration; } } @Component public class RoutesConfiguration extends RouteBuilder { @Override public void configure() throws Exception { getContext().setTracing(true); // Enable Camel route tracing System.out.println("22222222222"); onException(Exception.class) .handled(true) .log(LoggingLevel.ERROR, log, "Error processing XML request: ${exception.message}") .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(500)) .setBody(constant("Error processing XML request")) .to("direct:errorHandler"); from("direct:errorHandler") .log("Handling error: ${body}") // Additional error handling logic goes here .end(); // Configure REST configuration restConfiguration() .enableCORS(true) .port(5001) .component("servlet") .bindingMode(RestBindingMode.auto); // Define existing REST endpoint rest("/test") .post("/api") .id("api-route") .consumes("application/xml; charset=UTF-8") .produces("application/xml; charset=UTF-8") .routeId("request-handler") .type(String.class) .outType(String.class) .to("direct:processXml"); // Camel route for processing XML data from("direct:processXml") .autoStartup(true) .routeId("request-handler") .log(LoggingLevel.INFO, log, "Received XML request: ${body}") .setHeader(Exchange.HTTP_METHOD, constant("POST")) .setHeader(Exchange.CONTENT_TYPE, constant("application/xml")) .setExchangePattern(ExchangePattern.InOut) .convertBodyTo(String.class) .process(xmlProcessor) .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200)) .log(LoggingLevel.INFO, "Processed XML response: ${body}") .end(); } @PostConstruct public void startRoute() throws Exception { RouteController routeController = camelContext.getRouteController(); routeController.startRoute("request-handler"); } }
问题排查与解决方案
- 重复RouteId引发路由冲突:REST定义的路由和
direct:processXml路由使用了相同的routeId="request-handler",Camel不允许重复ID,会导致其中一个路由无法正常注册。将direct:processXml的routeId修改为唯一值,比如xml-processing-route。 - 手动调用configure()导致重复初始化:
CamelWebConfiguration中手动调用routesConfiguration.configure()属于冗余操作,Spring Boot整合Camel时会自动调用RouteBuilder的configure方法,删除该行代码。 - 端口配置优先级问题:
restConfiguration()中的.port(5001)在Servlet模式下不生效,实际端口由Spring Boot的server.port配置决定。检查application.properties或application.yml中是否设置了server.port=5001。 - 冗余的路由启动代码:
direct:processXml已设置autoStartup(true),REST路由默认自动启动,删除@PostConstruct注解的startRoute()方法,避免因重复RouteId导致启动错误路由。 - 依赖完整性检查:确保项目依赖中包含
camel-spring-boot-starter和camel-servlet-starter,否则Servlet组件无法正常工作。
内容的提问来源于stack exchange,提问作者kidy ad
相关产品推荐
相关产品推荐

