This is an automated email from the ASF dual-hosted git repository.

fmariani pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot-examples.git


The following commit(s) were added to refs/heads/main by this push:
     new 9bfb5cc  CAMEL-19886: Add rest-cxf example
9bfb5cc is described below

commit 9bfb5cc1233464c6857455921a225e4657c737c5
Author: Marco Carletti <mcarl...@redhat.com>
AuthorDate: Tue Sep 19 22:18:33 2023 +0200

    CAMEL-19886: Add rest-cxf example
---
 README.adoc                                        |   2 +
 pom.xml                                            |   1 +
 rest-cxf/README.adoc                               |  91 +++++++++++++++++
 rest-cxf/pom.xml                                   | 113 +++++++++++++++++++++
 .../camel/example/springboot/cxf/Application.java  |  34 +++++++
 .../camel/example/springboot/cxf/CamelRouter.java  |  51 ++++++++++
 .../camel/example/springboot/cxf/CxfConfig.java    |  31 ++++++
 .../apache/camel/example/springboot/cxf/User.java  |  68 +++++++++++++
 .../camel/example/springboot/cxf/UserService.java  |  69 +++++++++++++
 .../example/springboot/cxf/UserServiceImpl.java    |  51 ++++++++++
 rest-cxf/src/main/resources/application.properties |  21 ++++
 11 files changed, 532 insertions(+)

diff --git a/README.adoc b/README.adoc
index b53c8ac..fa3634b 100644
--- a/README.adoc
+++ b/README.adoc
@@ -127,6 +127,8 @@ Number of Examples: 49 (0 deprecated)
 
 | link:platform-http/README.adoc[Platform Http] (platform-http) | Rest | An 
example showing Camel REST DSL with platform HTTP
 
+| link:rest-cxf/README.adoc[Rest Cxf] (rest-cxf) | Rest | An example showing 
Camel REST using CXF with Spring Boot
+
 | link:rest-openapi/README.adoc[Rest Openapi] (rest-openapi) | Rest | An 
example showing Camel REST DSL and OpenApi with Spring Boot
 
 | link:rest-openapi-simple/README.adoc[REST OpenApi] (rest-openapi-simple) | 
Rest | This example shows how to call a Rest service defined using OpenApi 
specification
diff --git a/pom.xml b/pom.xml
index 420ded6..8d63595 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,6 +65,7 @@
                <module>rabbitmq</module>
                <module>reactive-streams</module>
                <module>resilience4j</module>
+               <module>rest-cxf</module>
                <module>rest-openapi</module>
                <module>rest-openapi-simple</module>
                <module>rest-openapi-springdoc</module>
diff --git a/rest-cxf/README.adoc b/rest-cxf/README.adoc
new file mode 100644
index 0000000..111e61c
--- /dev/null
+++ b/rest-cxf/README.adoc
@@ -0,0 +1,91 @@
+== Spring Boot Example with Camel exposing REST services using Apache CXF
+
+=== 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 using https://cxf.apache.org/[Apache CXF].
+
+
+=== Build
+
+You can build this example using:
+
+    $ mvn package
+
+=== Run
+
+You can run this example using:
+
+    $ mvn spring-boot:run
+
+After the Spring Boot application is started, you can open the following URL 
in your web browser to access the list of services: 
http://localhost:8080/services/ including WADL definition
+
+You can also access the REST endpoint from the command line:
+
+List all the users
+[source,text]
+----
+$ curl http://localhost:8080/services/api/user -s | jq .
+----
+
+The command will produce the following output:
+
+[source,json]
+----
+[ {
+  "id" : 1,
+  "name" : "John Coltrane"
+}, {
+  "id" : 2,
+  "name" : "Miles Davis"
+}, {
+  "id" : 3,
+  "name" : "Sonny Rollins"
+} ]
+----
+
+Retrieve a specific user
+[source,text]
+----
+$ curl http://localhost:8080/services/api/user/1 -s | jq .
+----
+
+The command will produce the following output:
+
+[source,json]
+----
+{
+  "id": 1,
+  "name": "John Coltrane"
+}
+----
+
+Insert/update user
+
+[source,text]
+----
+$ curl -X PUT http://localhost:8080/services/api/user --data 
'{"id":4,"name":"Charlie Parker"}' -H 'Content-Type: application/json' -v
+----
+
+The http status code of the response will be 
https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml#http-status-codes-1[201]
+
+Moreover, the input user is validated according to the annotations on the 
link:src/main/java/org/apache/camel/example/springboot/cxf/User.java[User bean]
+
+[source,text]
+----
+$ curl -X PUT http://localhost:8080/services/api/user --data 
'{"id":4,"name":"C"}' -H 'Content-Type: application/json'
+----
+
+will produce a validation error
+
+
+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/community/support/[let us know].
+
+We also love contributors, so
+https://camel.apache.org/community/contributing/[get involved] :-)
+
+The Camel riders!
diff --git a/rest-cxf/pom.xml b/rest-cxf/pom.xml
new file mode 100644
index 0000000..82c738e
--- /dev/null
+++ b/rest-cxf/pom.xml
@@ -0,0 +1,113 @@
+<!--
+
+    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>4.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-example-spring-boot-rest-cxf</artifactId>
+    <name>Camel SB Examples :: REST using CXF</name>
+    <description>An example showing Camel REST using CXF with Spring 
Boot</description>
+
+    <properties>
+        <category>Rest</category>
+    </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-bom</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>
+        </dependency>
+        <!-- Camel -->
+        <dependency>
+            <groupId>org.apache.camel.springboot</groupId>
+            <artifactId>camel-log-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.springboot</groupId>
+            <artifactId>camel-bean-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.springboot</groupId>
+            <artifactId>camel-bean-validator-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.springboot</groupId>
+            <artifactId>camel-cxf-rest-starter</artifactId>
+        </dependency>
+
+        <!-- jax-rs json provider from jackson -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.jakarta.rs</groupId>
+            <artifactId>jackson-jakarta-rs-json-provider</artifactId>
+        </dependency>
+
+        <!-- CXF WADL definition-->
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-rs-service-description</artifactId>
+            <version>${cxf-version}</version>
+        </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/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/Application.java
 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/Application.java
new file mode 100644
index 0000000..7437d55
--- /dev/null
+++ 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/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.cxf;
+
+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/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/CamelRouter.java
 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/CamelRouter.java
new file mode 100644
index 0000000..fe8b447
--- /dev/null
+++ 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/CamelRouter.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.cxf;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.bean.validator.BeanValidationException;
+
+import org.springframework.stereotype.Component;
+
+import jakarta.ws.rs.core.Response;
+
+@Component
+public class CamelRouter extends RouteBuilder {
+
+    @Override
+    public void configure() throws Exception {
+        //very raw way, just to handle the validation responses
+        onException(BeanValidationException.class)
+                .handled(true)
+                .setHeader(Exchange.HTTP_RESPONSE_CODE, 
constant(Response.Status.BAD_REQUEST.getStatusCode()))
+                
.setBody(simple("${exchangeProperty.CamelExceptionCaught.getMessage()}"));
+
+        // @formatter:off
+        from("cxfrs:/api?" +
+                    
"resourceClasses=org.apache.camel.example.springboot.cxf.UserService" +
+                    "&bindingStyle=SimpleConsumer" +
+                    "&providers=jaxrsProvider" +
+                    "&loggingFeatureEnabled=true")
+                .to("bean-validator:user")
+                .to("log:camel-cxf-log?showAll=true")
+                .setHeader(Exchange.BEAN_METHOD_NAME, 
simple("${header.operationName}"))
+                .bean(UserServiceImpl.class);
+        // @formatter:on
+    }
+
+}
diff --git 
a/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/CxfConfig.java 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/CxfConfig.java
new file mode 100644
index 0000000..b15be0d
--- /dev/null
+++ 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/CxfConfig.java
@@ -0,0 +1,31 @@
+/*
+ * 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.cxf;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider;
+
+@Configuration
+public class CxfConfig {
+
+       @Bean
+       public JacksonJsonProvider jaxrsProvider() {
+               return new JacksonJsonProvider();
+       }
+}
diff --git 
a/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/User.java 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/User.java
new file mode 100644
index 0000000..c9356fd
--- /dev/null
+++ b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/User.java
@@ -0,0 +1,68 @@
+/*
+ * 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.cxf;
+
+import java.util.StringJoiner;
+
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+
+/**
+ * User entity
+ *
+ */
+public class User {
+
+    @NotNull(message = "custom message")
+    private Integer id;
+
+    @NotNull
+    @Size(min = 3, max = 20)
+    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 new StringJoiner(", ", User.class.getSimpleName() + "[", "]")
+                .add("id=" + id)
+                .add("name='" + name + "'")
+                .toString();
+    }
+}
diff --git 
a/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/UserService.java
 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/UserService.java
new file mode 100644
index 0000000..0241add
--- /dev/null
+++ 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/UserService.java
@@ -0,0 +1,69 @@
+/*
+ * 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.cxf;
+
+import java.util.Collection;
+
+import jakarta.validation.Valid;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.PUT;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+
+/**
+ * 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.
+     */
+    @GET
+    @Path("/user/{id}")
+    @Produces(MediaType.APPLICATION_JSON)
+    User findUser(@PathParam("id") Integer id);
+
+    /**
+     * Find all users
+     *
+     * @return a collection of all users
+     */
+    @GET
+    @Path("/user")
+    @Produces(MediaType.APPLICATION_JSON)
+    Collection<User> findUsers();
+
+    /**
+     * Update the given user
+     *
+     * @param user
+     *            the user
+     */
+    @PUT
+    @Path("/user")
+    @Consumes(MediaType.APPLICATION_JSON)
+    Response updateUser(@Valid User user);
+
+}
diff --git 
a/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/UserServiceImpl.java
 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/UserServiceImpl.java
new file mode 100644
index 0000000..a5482da
--- /dev/null
+++ 
b/rest-cxf/src/main/java/org/apache/camel/example/springboot/cxf/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.cxf;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.TreeMap;
+
+import jakarta.ws.rs.core.Response;
+
+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 Response updateUser(User user) {
+        users.put(user.getId(), user);
+        return Response.noContent().status(Response.Status.CREATED).build();
+    }
+
+}
diff --git a/rest-cxf/src/main/resources/application.properties 
b/rest-cxf/src/main/resources/application.properties
new file mode 100644
index 0000000..0097a49
--- /dev/null
+++ b/rest-cxf/src/main/resources/application.properties
@@ -0,0 +1,21 @@
+## ---------------------------------------------------------------------------
+## 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
+camel.springboot.main-run-controller=true
+#logging.level.org.apache.cxf = TRACE

Reply via email to