You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/03/07 11:09:01 UTC

(camel) 01/01: CAMEL-20533: camel-rest - Binding mode json or xml should automatically set consumes/produces on the rest endpoint according to the binding mode.

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

davsclaus pushed a commit to branch rest-binding
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 90847050e1f9b5d02c548090e2c0bc9984ce31fc
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Mar 7 12:08:47 2024 +0100

    CAMEL-20533: camel-rest - Binding mode json or xml should automatically set consumes/produces on the rest endpoint according to the binding mode.
---
 .../apache/camel/component/rest/RestEndpoint.java  |  4 +-
 .../apache/camel/model/rest/RestDefinition.java    | 49 +++++++++++++++-------
 docs/user-manual/modules/ROOT/pages/rest-dsl.adoc  | 12 ++++--
 3 files changed, 44 insertions(+), 21 deletions(-)

diff --git a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
index 064232a1f7c..b2aa8f87b79 100644
--- a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
+++ b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
@@ -588,8 +588,8 @@ public class RestEndpoint extends DefaultEndpoint {
                     getUriTemplate(), getConsumes(), getProduces(), config, getParameters());
             configureConsumer(consumer);
 
-            // add to rest registry so we can keep track of them, we will remove from the registry when the consumer is removed
-            // the rest registry will automatic keep track when the consumer is removed,
+            // add to rest registry, so we can keep track of them, we will remove from the registry when the consumer is removed
+            // the rest registry will automatically keep track when the consumer is removed,
             // and un-register the REST service from the registry
             getCamelContext().getRestRegistry().addRestService(consumer, url, baseUrl, getPath(), getUriTemplate(), getMethod(),
                     getConsumes(), getProduces(), getInType(), getOutType(), getRouteId(), getDescription());
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestDefinition.java
index 0f82d3d3bb5..a2ebaa6404e 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestDefinition.java
@@ -909,6 +909,11 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
             binding.setOutType(parseText(camelContext, verb.getOutType()));
             binding.setOutTypeClass(verb.getOutTypeClass());
             // verb takes precedence over configuration on rest
+            if (verb.getBindingMode() != null) {
+                binding.setBindingMode(parseText(camelContext, verb.getBindingMode()));
+            } else {
+                binding.setBindingMode(getBindingMode());
+            }
             if (verb.getConsumes() != null) {
                 binding.setConsumes(parseText(camelContext, verb.getConsumes()));
             } else {
@@ -919,10 +924,31 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
             } else {
                 binding.setProduces(getProduces());
             }
-            if (verb.getBindingMode() != null) {
-                binding.setBindingMode(parseText(camelContext, verb.getBindingMode()));
-            } else {
-                binding.setBindingMode(getBindingMode());
+            if (binding.getType() != null || binding.getOutType() != null && binding.getBindingMode() != null) {
+                // okay we have binding mode and in/out type defined - then we can infer consume/produces
+                String mode = binding.getBindingMode();
+                if ("json".equals(mode)) {
+                    if (binding.getConsumes() == null && binding.getType() != null) {
+                        binding.setConsumes("application/json");
+                    }
+                    if (binding.getProduces() == null && binding.getOutType() != null) {
+                        binding.setProduces("application/json");
+                    }
+                } else if ("xml".equals(mode)) {
+                    if (binding.getConsumes() == null && binding.getType() != null) {
+                        binding.setConsumes("application/xml");
+                    }
+                    if (binding.getProduces() == null && binding.getOutType() != null) {
+                        binding.setProduces("application/xml");
+                    }
+                } else if ("json_xml".equals(mode)) {
+                    if (binding.getConsumes() == null && binding.getType() != null) {
+                        binding.setConsumes("application/json;application/xml");
+                    }
+                    if (binding.getProduces() == null && binding.getOutType() != null) {
+                        binding.setProduces("application/json;application/xml");
+                    }
+                }
             }
             if (verb.getSkipBindingOnErrorCode() != null) {
                 binding.setSkipBindingOnErrorCode(parseText(camelContext, verb.getSkipBindingOnErrorCode()));
@@ -968,18 +994,12 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
 
             // append options
             Map<String, Object> options = new HashMap<>();
-            // verb takes precedence over configuration on rest
-            if (verb.getConsumes() != null) {
-                options.put("consumes", parseText(camelContext, verb.getConsumes()));
-            } else if (getConsumes() != null) {
-                options.put("consumes", getConsumes());
+            if (binding.getConsumes() != null) {
+                options.put("consumes", binding.getConsumes());
             }
-            if (verb.getProduces() != null) {
-                options.put("produces", parseText(camelContext, verb.getProduces()));
-            } else if (getProduces() != null) {
-                options.put("produces", getProduces());
+            if (binding.getProduces() != null) {
+                options.put("produces", binding.getProduces());
             }
-
             // append optional type binding information
             String inType = binding.getType();
             if (inType != null) {
@@ -989,7 +1009,6 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
             if (outType != null) {
                 options.put("outType", outType);
             }
-
             if (component != null && !component.isEmpty()) {
                 options.put("consumerComponentName", component);
             }
diff --git a/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc b/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc
index a32e1ec28a0..da30ec0b68a 100644
--- a/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc
+++ b/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc
@@ -295,13 +295,13 @@ not enabled.
 
 |json |Binding to/from json is enabled, and requires a json capable data
 format on the classpath. By default Camel will use `jackson` as the
-data format. See the INFO box below for more details.
+data format.
 
 |xml |Binding to/from xml is enabled, and requires `camel-jaxb` on the
-classpath. See the INFO box below for more details.
+classpath.
 
 |json_xml |Binding to/from json and xml is enabled and requires both data formats to
-be on the classpath. See the INFO box below for more details.
+be on the classpath.
 |===
 
 When using camel-jaxb for xml bindings, then
@@ -372,7 +372,11 @@ json_xml |JSON
 |===
  
 When using binding you must also configure what POJO type to map to.
-This is mandatory for incoming messages, and optional for outgoing. 
+This is mandatory for incoming messages, and optional for outgoing.
+
+NOTE: When using binding mode `json`, `xml` or `json_xml` then Camel will automatically set `consumers` and `produces`
+on the rest endpoint (according to the mode), if not already explicit configured. For example with binding mode `json`
+and setting the outType as `UserPojo` then Camel will define this rest endpoint as producing `application/json`.
 
 For example to map from xml/json to a pojo class `UserPojo` you do this
 in Java DSL as shown below: