diff --git a/camel-api/README.md b/camel-api/README.md new file mode 100644 index 0000000000..fe8dadcfe1 --- /dev/null +++ b/camel-api/README.md @@ -0,0 +1,15 @@ +Example for the Article on Camel API with SpringBoot + +to start up, run: + mvn spring-boot:run + +them, do a POST http request to: + http://localhost:8080/camel/api/bean + +with the HEADER: Content-Type: application/json, + +and a BODY Payload like {"id": 1,"name": "World"} + +and we will get a return code of 201 and the response: Hello, World - if the transform() method from Application class is uncommented and the process() method is commented + +or return code of 201 and the response: {"id": 10,"name": "Hello, World"} - if the transform() method from Application class is commented and the process() method is uncommented diff --git a/camel-api/pom.xml b/camel-api/pom.xml new file mode 100644 index 0000000000..6db9f9bfd1 --- /dev/null +++ b/camel-api/pom.xml @@ -0,0 +1,80 @@ + + + + 4.0.0 + + com.example + spring-boot-camel + 0.0.1-SNAPSHOT + + Spring-Boot - Camel API + + + UTF-8 + 3.6.0 + 2.19.1 + 2.19.1 + 1.5.4.RELEASE + + + + + org.apache.camel + camel-servlet-starter + ${camel.version} + + + org.apache.camel + camel-jackson-starter + ${camel.version} + + + org.apache.camel + camel-swagger-java-starter + ${camel.version} + + + org.apache.camel + camel-spring-boot-starter + ${camel.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-starter.version} + + + + + spring-boot:run + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-starter.version} + + + + repackage + + + + + + + diff --git a/camel-api/src/main/java/com/baeldung/camel/Application.java b/camel-api/src/main/java/com/baeldung/camel/Application.java new file mode 100644 index 0000000000..f805385ff9 --- /dev/null +++ b/camel-api/src/main/java/com/baeldung/camel/Application.java @@ -0,0 +1,104 @@ +package com.baeldung.camel; + +import javax.ws.rs.core.MediaType; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.servlet.CamelHttpTransportServlet; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.model.rest.RestBindingMode; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.stereotype.Component; + +@SpringBootApplication +@ComponentScan(basePackages="com.baeldung.camel") +public class Application extends SpringBootServletInitializer { + + @Value("${server.port}") + String serverPort; + + @Value("${baeldung.api.path}") + String contextPath; + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Bean + ServletRegistrationBean servletRegistrationBean() { + ServletRegistrationBean servlet = new ServletRegistrationBean(new CamelHttpTransportServlet(), contextPath+"/*"); + servlet.setName("CamelServlet"); + return servlet; + } + + + @Component + class RestApi extends RouteBuilder { + + @Override + public void configure() { + + CamelContext context = new DefaultCamelContext(); + + + // http://localhost:8080/camel/api-doc + restConfiguration().contextPath(contextPath) // + .port(serverPort) + .enableCORS(true) + .apiContextPath("/api-doc") + .apiProperty("api.title", "Test REST API") + .apiProperty("api.version", "v1") + .apiProperty("cors", "true") // cross-site + .apiContextRouteId("doc-api") + .component("servlet") + .bindingMode(RestBindingMode.json) + .dataFormatProperty("prettyPrint", "true"); +/** +The Rest DSL supports automatic binding json/xml contents to/from POJOs using Camels Data Format. +By default the binding mode is off, meaning there is no automatic binding happening for incoming and outgoing messages. +You may want to use binding if you develop POJOs that maps to your REST services request and response types. +This allows you, as a developer, to work with the POJOs in Java code. +*/ + + rest("/api/").description("Teste REST Service") + .id("api-route") + .post("/bean") + .produces(MediaType.APPLICATION_JSON) + .consumes(MediaType.APPLICATION_JSON) +// .get("/hello/{place}") + .bindingMode(RestBindingMode.auto) + .type(MyBean.class) + .enableCORS(true) +// .outType(OutBean.class) + + .to("direct:remoteService"); + + + from("direct:remoteService") + .routeId("direct-route") + .tracing() + .log(">>> ${body.id}") + .log(">>> ${body.name}") +// .transform().simple("blue ${in.body.name}") + .process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + MyBean bodyIn = (MyBean) exchange.getIn().getBody(); + + ExampleServices.example(bodyIn); + + exchange.getIn().setBody(bodyIn); + } + }) + .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(201)); + } + } +} diff --git a/camel-api/src/main/java/com/baeldung/camel/ExampleServices.java b/camel-api/src/main/java/com/baeldung/camel/ExampleServices.java new file mode 100644 index 0000000000..ec8f368e68 --- /dev/null +++ b/camel-api/src/main/java/com/baeldung/camel/ExampleServices.java @@ -0,0 +1,15 @@ +package com.baeldung.camel; + +/** + * a Mock class to show how some other layer + * (a persistence layer, for instance) + * could be used insida a Camel + * + */ +public class ExampleServices { + + public static void example(MyBean bodyIn) { + bodyIn.setName( "Hello, " + bodyIn.getName() ); + bodyIn.setId(bodyIn.getId()*10); + } +} diff --git a/camel-api/src/main/java/com/baeldung/camel/MyBean.java b/camel-api/src/main/java/com/baeldung/camel/MyBean.java new file mode 100644 index 0000000000..5368e40c93 --- /dev/null +++ b/camel-api/src/main/java/com/baeldung/camel/MyBean.java @@ -0,0 +1,18 @@ +package com.baeldung.camel; + +public class MyBean { + private Integer id; + private String name; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} diff --git a/camel-api/src/main/resources/application.properties b/camel-api/src/main/resources/application.properties new file mode 100644 index 0000000000..bce95f8eaf --- /dev/null +++ b/camel-api/src/main/resources/application.properties @@ -0,0 +1,15 @@ +logging.config=classpath:logback.xml + +# the options from org.apache.camel.spring.boot.CamelConfigurationProperties can be configured here +camel.springboot.name=MyCamel + +# lets listen on all ports to ensure we can be invoked from the pod IP +server.address=0.0.0.0 +management.address=0.0.0.0 + +# lets use a different management port in case you need to listen to HTTP requests on 8080 +management.port=8081 + +# disable all management enpoints except health +endpoints.enabled = true +endpoints.health.enabled = true \ No newline at end of file diff --git a/camel-api/src/main/resources/application.yml b/camel-api/src/main/resources/application.yml new file mode 100644 index 0000000000..3a4b913db7 --- /dev/null +++ b/camel-api/src/main/resources/application.yml @@ -0,0 +1,27 @@ +server: + port: 8080 + +# for example purposes of Camel version 2.18 and below +baeldung: + api: + path: '/camel' + +camel: + springboot: + # The Camel context name + name: ServicesRest + +# Binding health checks to a different port +management: + port: 8081 + +# disable all management enpoints except health +endpoints: + enabled: false + health: + enabled: true + +# The application configuration properties +quickstart: + generateOrderPeriod: 10s + processOrderPeriod: 30s diff --git a/camel-api/src/main/resources/logback.xml b/camel-api/src/main/resources/logback.xml new file mode 100644 index 0000000000..d0b4334f5a --- /dev/null +++ b/camel-api/src/main/resources/logback.xml @@ -0,0 +1,17 @@ + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + +