restspring-bootapache-camelspring-camel

Getting 404 "Not Found" error from basic Spring Boot Camel REST DSL request


I have been working on a basic demo of Camel and REST DSL for the past few days, but I have finally hit a brick wall with this issue. I am fairly new to Spring Boot's magic, so any feedback is much appreciated!

When I run the project, everything looks like it starts up correctly for my two routes. However, when I try a GET request, I always get a 404 "Not Found" message back.

The only two classes I have are in the same package, so I do not believe visibility would be the problem. I created the project as a Spring Start Project, and I run it as a Spring Boot application. The logs show that the two routes are started successfully, and Tomcat is using port 8080. The context path is specifically configured in the application.properties file.

My main application class:

package com.example.demo;

import org.apache.camel.CamelContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@SpringBootApplication
@Configuration
@ComponentScan("com.example.demo")
public class DemoApplication {

@Autowired
CamelContext camelContext;

public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
 }
}  

My router class:

package com.example.demo;

import org.springframework.stereotype.Component;
import org.apache.camel.LoggingLevel;
import org.apache.camel.model.rest.RestBindingMode;
import org.apache.camel.builder.RouteBuilder;   

@Component
public class DemoCamelRouter extends RouteBuilder {
    @Override
      public void configure() throws Exception {

        restConfiguration().component("servlet")
            .bindingMode(RestBindingMode.auto);

        rest().get("/hello")
          .to("direct:hello");

       from("direct:hello")
          .log(LoggingLevel.INFO, "Hello World")
          .transform().simple("Hello World");
       }
}

My application.properties file:

camel.springboot.main-run-controller=true
server.servlet.context-path=/demo

I am testing this service using http://localhost:8080/demo/hello

Here are the Maven dependencies I have.

spring-boot-starter-web (managed:2.1.0.RELEASE)
spring-boot-starter-web-services (managed:2.1.0.RELEASE)
spring-boot-starter-test (managed:2.1.0.RELEASE)
camel-core: 2.22.2
camel-spring-boot-starter: 2.22.2
camel-servlet: 2.22.2
camel-http-common: 2.22.2
javax.servlet-api (managed:4.0.1)

Lastly, here is what the log shows.

2018-11-21 00:58:38.454  INFO 11072 --- [           main] o.a.camel.spring.boot.RoutesCollector    : Starting CamelMainRunController to ensure the main thread keeps running
2018-11-21 00:58:38.470  INFO 11072 --- [           main] o.a.camel.spring.SpringCamelContext      : Route: route2 started and consuming from: direct://hello
2018-11-21 00:58:38.470  INFO 11072 --- [           main] o.a.camel.spring.SpringCamelContext      : Route: route1 started and consuming from: servlet:/hello?httpMethodRestrict=GET
2018-11-21 00:58:38.470  INFO 11072 --- [           main] o.a.camel.spring.SpringCamelContext      : Total 2 routes, of which 2 are started
2018-11-21 00:58:38.470  INFO 11072 --- [           main] o.a.camel.spring.SpringCamelContext      : Apache Camel 2.22.2 (CamelContext: camel-1) started in 0.236 seconds
2018-11-21 00:58:38.486  INFO 11072 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path '/demo'
2018-11-21 00:58:38.501  INFO 11072 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 3.882 seconds (JVM running for 6.868)
2018-11-21 01:00:12.445  INFO 11072 --- [nio-8080-exec-4] o.a.c.c.C.[Tomcat].[localhost].[/demo]   : Initializing Spring DispatcherServlet 'dispatcherServlet'
2018-11-21 01:00:12.445  INFO 11072 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2018-11-21 01:00:12.453  INFO 11072 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Completed initialization in 8 ms

Solution

  • As of Camel’s version 2.19, CamelServlet is by default set to “/camel”. So your url becomes:

    http://localhost:8080/demo/camel/hello 
    

    Update: You will also need to define following bean as you're using camel-servlet:

    @Bean
    public ServletRegistrationBean<Servlet> servletRegistrationBean() {
        ServletRegistrationBean<Servlet> registration = new ServletRegistrationBean<>(new CamelHttpTransportServlet(), "/camel/*");
        registration.setName("CamelServlet");
        return registration;
    }
    

    Or instead of camel-servlet dependency, you should add camel-servlet-starter dependency