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
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