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

1

7

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
Thither answered 21/11, 2018 at 7:44 Comment(0)
D
13

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

Darceydarci answered 21/11, 2018 at 8:34 Comment(6)
Hi Sukhpal, Thank you for the response. I tried the above mentioned link, but I still get a 404 response back. Perhaps, there is another issue in the project as well.Thither
@Thither Which version of camel spring boot starter are you using? Do check servlet-componentDarceydarci
Sukhpal, I have now added a list of all my maven dependencies in the above question in case there is a mistake there. I am using camel-spring-boot-starter version 2.22.2 which is the same as the camel-core version. With these, I am using Java 8. Thanks!Thither
Looking more closely at my Maven dependencies, there may be some unnecessary ones there, like javax.servlet-api and spring-boot-starter-web-services. I tried removing these, and nothing changed in the app's log output.Thither
Thank you Sukhpal! I added the camel-servlet-starter dependency instead of the camel-servlet dependency, and it works now. Much appreciated!Thither
Happy to help. Please accept the answer if it helped.Darceydarci

© 2022 - 2024 — McMap. All rights reserved.