This is an automated email from the ASF dual-hosted git repository. ffang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git
The following commit(s) were added to refs/heads/master by this push: new df3e14e [CAMEL-14454]add camel-example-spring-boot-rest-openapi example df3e14e is described below commit df3e14e796a9fca886f52f7159ca875934542cfb Author: Freeman Fang <freeman.f...@gmail.com> AuthorDate: Wed Jan 29 15:21:35 2020 -0500 [CAMEL-14454]add camel-example-spring-boot-rest-openapi example --- .../README.adoc | 86 ++++++++++++++ .../camel-example-spring-boot-rest-openapi/pom.xml | 126 +++++++++++++++++++++ .../camel/example/springboot/Application.java | 34 ++++++ .../camel/example/springboot/CamelRouter.java | 88 ++++++++++++++ .../org/apache/camel/example/springboot/User.java | 60 ++++++++++ .../camel/example/springboot/UserService.java | 50 ++++++++ .../camel/example/springboot/UserServiceImpl.java | 51 +++++++++ .../src/main/resources/application.properties | 41 +++++++ 8 files changed, 536 insertions(+) diff --git a/examples/camel-example-spring-boot-rest-openapi/README.adoc b/examples/camel-example-spring-boot-rest-openapi/README.adoc new file mode 100644 index 0000000..b205177 --- /dev/null +++ b/examples/camel-example-spring-boot-rest-openapi/README.adoc @@ -0,0 +1,86 @@ +== Spring Boot Example with Camel REST DSL and OpenApi + +=== Introduction + +This example illustrates how to use https://projects.spring.io/spring-boot/[Spring Boot] with http://camel.apache.org[Camel]. It provides a simple REST service that is created with http://camel.apache.org/rest-dsl.html[Camel REST DSL] and documented with http://swagger.io[OpenApi]. + +The project uses the `camel-spring-boot-starter` dependency, a Spring Boot starter dependency for Camel that simplifies the Maven configuration. + +The project also uses `camel-servlet` component as the HTTP transport component for Camel REST DSL. + +=== Build + +You can build this example using: + + $ mvn package + +=== Run + +You can run this example using: + + $ mvn spring-boot:run + +You should see the following output when the application is launched: + +[source,text] +---- +... +[INFO] --- spring-boot-maven-plugin:1.5.10.RELEASE:run (default-cli) @ camel-example-spring-boot-rest-openapi --- +[...] + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.0.0.RELEASE) +[...] +2017-03-05 14:55:44.032 INFO 15312 --- [ main] o.a.camel.spring.SpringCamelContext : Total 4 routes, of which 4 are started. +2017-03-05 14:55:44.034 INFO 15312 --- [ main] o.a.camel.spring.SpringCamelContext : Apache Camel 2.22.0-SNAPSHOT (CamelContext: camel-1) started in 0.614 seconds +2017-03-05 14:55:44.131 INFO 15312 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) +2017-03-05 14:55:44.140 INFO 15312 --- [ main] o.a.c.example.springboot.Application : Started Application in 6.265 seconds (JVM running for 21.092) +---- + +After the Spring Boot application is started, you can open the following URL in your web browser to access the REST endpoint and retrieve a list of users: http://localhost:8080/camel/users + +You can also access the REST endpoint from the command line: + +[source,text] +---- +$ curl http://localhost:8080/api/users +---- + +The command will produce the following output: + +[source,json] +---- +[ { + "id" : 1, + "name" : "John Coltrane" +}, { + "id" : 2, + "name" : "Miles Davis" +}, { + "id" : 3, + "name" : "Sonny Rollins" +} ] +---- + +The OpenApi documentation is located at: `\http://localhost:8080/api/api-doc` and can be retrieved with the following command: + +[source,text] +---- +$ curl http://localhost:8080/api/api-doc +---- + +The Spring Boot application can be stopped pressing `[CTRL] + [C]` in the shell. + +=== Help and contributions + +If you hit any problem using Camel or have some feedback, then please +https://camel.apache.org/support.html[let us know]. + +We also love contributors, so +https://camel.apache.org/contributing.html[get involved] :-) + +The Camel riders! diff --git a/examples/camel-example-spring-boot-rest-openapi/pom.xml b/examples/camel-example-spring-boot-rest-openapi/pom.xml new file mode 100644 index 0000000..cbe5e40 --- /dev/null +++ b/examples/camel-example-spring-boot-rest-openapi/pom.xml @@ -0,0 +1,126 @@ +<!-- + + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.camel.springboot.example</groupId> + <artifactId>examples</artifactId> + <version>3.1.0-SNAPSHOT</version> + </parent> + + <artifactId>camel-example-spring-boot-rest-openapi</artifactId> + <name>Camel SB Examples :: REST DSL and OpenApi</name> + <description>An example showing Camel REST DSL and OpenApi with Spring Boot</description> + + <properties> + <category>Rest</category> + <spring.boot-version>${spring-boot-version}</spring.boot-version> + </properties> + + <!-- Spring-Boot and Camel BOM --> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-dependencies</artifactId> + <version>${spring.boot-version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + <dependency> + <groupId>org.apache.camel.springboot</groupId> + <artifactId>camel-spring-boot-dependencies</artifactId> + <version>${project.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <!-- Spring Boot --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + <exclusions> + <exclusion> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-tomcat</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-undertow</artifactId> + </dependency> + + <!-- Camel --> + <dependency> + <groupId>org.apache.camel.springboot</groupId> + <artifactId>camel-spring-boot-starter</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel.springboot</groupId> + <artifactId>camel-openapi-java-starter</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel.springboot</groupId> + <artifactId>camel-servlet-starter</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel.springboot</groupId> + <artifactId>camel-jackson-starter</artifactId> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + </dependency> + + <!-- Test --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-test</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <version>${spring.boot-version}</version> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + +</project> diff --git a/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/Application.java b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/Application.java new file mode 100644 index 0000000..4c0bd71 --- /dev/null +++ b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/Application.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.example.springboot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +// CHECKSTYLE:OFF +@SpringBootApplication +public class Application { + + /** + * Main method to start the application. + */ + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} +// CHECKSTYLE:ON diff --git a/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/CamelRouter.java b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/CamelRouter.java new file mode 100644 index 0000000..d139129 --- /dev/null +++ b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/CamelRouter.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.example.springboot; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.model.rest.RestBindingMode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import static org.apache.camel.model.rest.RestParamType.body; +import static org.apache.camel.model.rest.RestParamType.path; + +/** + * A simple Camel REST DSL route with OpenApi API documentation. + */ +@Component +public class CamelRouter extends RouteBuilder { + + @Autowired + private Environment env; + + @Value("${camel.component.servlet.mapping.context-path}") + private String contextPath; + + @Override + public void configure() throws Exception { + + // @formatter:off + + // this can also be configured in application.properties + restConfiguration() + .component("servlet") + .bindingMode(RestBindingMode.json) + .dataFormatProperty("prettyPrint", "true") + .enableCORS(true) + .port(env.getProperty("server.port", "8080")) + .contextPath(contextPath.substring(0, contextPath.length() - 2)) + // turn on openapi api-doc + .apiContextPath("/api-doc") + .apiProperty("api.title", "User API") + .apiProperty("api.version", "1.0.0"); + + rest("/users").description("User REST service") + .consumes("application/json") + .produces("application/json") + + .get().description("Find all users").outType(User[].class) + .responseMessage().code(200).message("All users successfully returned").endResponseMessage() + .to("bean:userService?method=findUsers") + + .get("/{id}").description("Find user by ID") + .outType(User.class) + .param().name("id").type(path).description("The ID of the user").dataType("integer").endParam() + .responseMessage().code(200).message("User successfully returned").endResponseMessage() + .to("bean:userService?method=findUser(${header.id})") + + .put("/{id}").description("Update a user").type(User.class) + .param().name("id").type(path).description("The ID of the user to update").dataType("integer").endParam() + .param().name("body").type(body).description("The user to update").endParam() + .responseMessage().code(204).message("User successfully updated").endResponseMessage() + .to("direct:update-user"); + + from("direct:update-user") + .to("bean:userService?method=updateUser") + .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(204)) + .setBody(constant("")); + + // @formatter:on + } + +} diff --git a/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/User.java b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/User.java new file mode 100644 index 0000000..7d953ca --- /dev/null +++ b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/User.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.example.springboot; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * User entity + * + */ +public class User { + + private Integer id; + + private String name; + + public User() { + } + + public User(Integer id, String name) { + this.id = id; + this.name = 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; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + +} diff --git a/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/UserService.java b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/UserService.java new file mode 100644 index 0000000..5208aab --- /dev/null +++ b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/UserService.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.example.springboot; + +import java.util.Collection; + +/** + * Service interface for managing users. + */ +public interface UserService { + + /** + * Find a user by the given ID + * + * @param id + * the ID of the user + * @return the user, or <code>null</code> if user not found. + */ + User findUser(Integer id); + + /** + * Find all users + * + * @return a collection of all users + */ + Collection<User> findUsers(); + + /** + * Update the given user + * + * @param user + * the user + */ + void updateUser(User user); + +} diff --git a/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/UserServiceImpl.java b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/UserServiceImpl.java new file mode 100644 index 0000000..69b6d60 --- /dev/null +++ b/examples/camel-example-spring-boot-rest-openapi/src/main/java/org/apache/camel/example/springboot/UserServiceImpl.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.example.springboot; + +import java.util.Collection; +import java.util.Map; +import java.util.TreeMap; + +import org.springframework.stereotype.Service; + +@Service("userService") +public class UserServiceImpl implements UserService { + + private final Map<Integer, User> users = new TreeMap<>(); + + public UserServiceImpl() { + users.put(1, new User(1, "John Coltrane")); + users.put(2, new User(2, "Miles Davis")); + users.put(3, new User(3, "Sonny Rollins")); + } + + @Override + public User findUser(Integer id) { + return users.get(id); + } + + @Override + public Collection<User> findUsers() { + return users.values(); + } + + @Override + public void updateUser(User user) { + users.put(user.getId(), user); + } + +} diff --git a/examples/camel-example-spring-boot-rest-openapi/src/main/resources/application.properties b/examples/camel-example-spring-boot-rest-openapi/src/main/resources/application.properties new file mode 100644 index 0000000..cfab0c7 --- /dev/null +++ b/examples/camel-example-spring-boot-rest-openapi/src/main/resources/application.properties @@ -0,0 +1,41 @@ +## --------------------------------------------------------------------------- +## Licensed to the Apache Software Foundation (ASF) under one or more +## contributor license agreements. See the NOTICE file distributed with +## this work for additional information regarding copyright ownership. +## The ASF licenses this file to You under the Apache License, Version 2.0 +## (the "License"); you may not use this file except in compliance with +## the License. You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## --------------------------------------------------------------------------- + +# the name of Camel +camel.springboot.name = MyCamel + +# to reconfigure the camel servlet context-path mapping to use /api/* instead of /camel/* +camel.component.servlet.mapping.context-path=/api/* + +# rest can also be configured here instead in the CamelRouter class +# rest DSL configuration +#camel.rest.component=servlet +#camel.rest.binding-mode=json +#camel.rest.data-format-property[prettyPrint]=true +#camel.rest.enable-cors=true +#camel.rest.port=${server.port:8080} +#camel.rest.context-path=/api + +# rest DSL api-doc configuration +#camel.rest.api-context-path=/api-doc +#camel.rest.api-property[api.title]=User API +#camel.rest.api-property[api.version]=1.0.0 + +# to configure logging levels +#logging.level.org.springframework = INFO +#logging.level.org.apache.camel.spring.boot = INFO +#logging.level.org.apache.camel.impl = DEBUG