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 2023/10/11 13:26:50 UTC

[camel] branch main updated: Camel-17040 add no data response option (#11673)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 0a61fb64c0f Camel-17040 add no data response option (#11673)
0a61fb64c0f is described below

commit 0a61fb64c0f3e23b5c3247963ae31513c20bde1a
Author: Jono Morris <jo...@xtra.co.nz>
AuthorDate: Thu Oct 12 02:26:40 2023 +1300

    Camel-17040 add no data response option (#11673)
    
    * CAMEL-17040 return 204 for empty json or xml
    
    * CAMEL-17040 update config and definition files
    
    * CAMEL-17040 generated changes
    
    * CAMEL-17040 unit tests for jetty and servlet components
    
    * CAMEL-17040 don't combine imports
    
    * CAMEL-17040 add generated files for catalog and dsl
    
    * CAMEL-17040 add note to upgrade guide
    
    * CAMEL-17040 update javadoc on config and definition files
    
    * CAMEL-17040 add new option to rest-dsl document
    
    * CAMEL-17040 generated files following javadoc update
    
    * misc generated changes in dsl and catalog modules
    
    * Revert "misc generated changes in dsl and catalog modules"
    
    This reverts commit a44e56e2b38efa228beca6737419cccb65c60b4e.
    
    * CAMEL-17040 add camel-spring.xsd updated with new option
---
 .../main/camel-main-configuration-metadata.json    |   1 +
 .../org/apache/camel/catalog/models/delete.json    |  11 +-
 .../org/apache/camel/catalog/models/get.json       |  11 +-
 .../org/apache/camel/catalog/models/head.json      |  11 +-
 .../org/apache/camel/catalog/models/patch.json     |  11 +-
 .../org/apache/camel/catalog/models/post.json      |  11 +-
 .../org/apache/camel/catalog/models/put.json       |  11 +-
 .../org/apache/camel/catalog/models/rest.json      |  13 +-
 .../apache/camel/catalog/models/restBinding.json   |   7 +-
 .../camel/catalog/models/restConfiguration.json    |  19 +-
 .../apache/camel/catalog/schemas/camel-spring.xsd  |  40 +++++
 .../apache/camel/component/jetty/rest/Address.java |  72 ++++++++
 .../rest/RestJettyNoContentRestConfigTest.java     | 194 +++++++++++++++++++++
 .../jetty/rest/RestJettyNoContentTest.java         | 194 +++++++++++++++++++++
 .../camel/component/jetty/rest/package-info.java   |  24 +++
 .../camel/component/servlet/rest/Address.java      |  72 ++++++++
 .../rest/RestServletNoContentRestConfigTest.java   | 164 +++++++++++++++++
 .../servlet/rest/RestServletNoContentTest.java     | 163 +++++++++++++++++
 .../camel/component/servlet/rest/package-info.java |  24 +++
 .../org/apache/camel/spi/RestConfiguration.java    |  16 ++
 .../camel/impl/RestConfigurationConfigurer.java    |   6 +
 .../org/apache/camel/model/rest/delete.json        |  11 +-
 .../resources/org/apache/camel/model/rest/get.json |  11 +-
 .../org/apache/camel/model/rest/head.json          |  11 +-
 .../org/apache/camel/model/rest/patch.json         |  11 +-
 .../org/apache/camel/model/rest/post.json          |  11 +-
 .../resources/org/apache/camel/model/rest/put.json |  11 +-
 .../org/apache/camel/model/rest/rest.json          |  13 +-
 .../org/apache/camel/model/rest/restBinding.json   |   7 +-
 .../apache/camel/model/rest/restConfiguration.json |  19 +-
 .../camel/model/rest/RestBindingDefinition.java    |  16 ++
 .../model/rest/RestConfigurationDefinition.java    |  37 ++++
 .../apache/camel/model/rest/RestDefinition.java    |  33 ++++
 .../apache/camel/model/rest/VerbDefinition.java    |  16 ++
 .../apache/camel/processor/RestBindingAdvice.java  |  29 +++
 .../camel/reifier/rest/RestBindingReifier.java     |   8 +-
 .../RestConfigurationPropertiesConfigurer.java     |   6 +
 .../camel-main-configuration-metadata.json         |   1 +
 core/camel-main/src/main/docs/main.adoc            |   3 +-
 .../java/org/apache/camel/xml/in/ModelParser.java  |   4 +
 .../java/org/apache/camel/xml/out/ModelWriter.java |   4 +
 .../org/apache/camel/yaml/out/ModelWriter.java     |   4 +
 .../ROOT/pages/camel-4x-upgrade-guide-4_1.adoc     |   4 +
 docs/user-manual/modules/ROOT/pages/rest-dsl.adoc  |   1 +
 .../dsl/yaml/deserializers/ModelDeserializers.java |  54 ++++++
 .../generated/resources/schema/camelYamlDsl.json   |  45 +++++
 46 files changed, 1346 insertions(+), 99 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index de05f6d7933..7c503cfd5be 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -200,6 +200,7 @@
     { "name": "camel.rest.corsHeaders", "description": "Sets the CORS headers to use if CORS has been enabled.", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": "java.util.Map" },
     { "name": "camel.rest.dataFormatProperties", "description": "Sets additional options on data format level", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": "java.util.Map" },
     { "name": "camel.rest.enableCORS", "description": "To specify whether to enable CORS which means Camel will automatic include CORS in the HTTP headers in the response. This option is default false", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
+    { "name": "camel.rest.enableNoContentResponse", "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.rest.endpointProperties", "description": "Sets additional options on endpoint level", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": "java.util.Map" },
     { "name": "camel.rest.host", "description": "Sets the hostname to use by the REST consumer", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "string", "javaType": "java.lang.String" },
     { "name": "camel.rest.hostNameResolver", "description": "Sets the resolver to use for resolving hostname", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": "org.apache.camel.spi.RestHostNameResolver", "defaultValue": "RestHostNameResolver.allLocalIp", "enum": [ "allLocalIp", "localIp", "localHostName" ] },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/delete.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/delete.json
index 8054f806f96..623137b1996 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/delete.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/delete.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/get.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/get.json
index 0f0a11e0999..fc35bc34cda 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/get.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/get.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/head.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/head.json
index 4ca8d49f83b..c461d288a9b 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/head.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/head.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/patch.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/patch.json
index 0fb0cb0c911..6c19d4539b7 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/patch.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/patch.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/post.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/post.json
index 93ade5c6033..07f59a85143 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/post.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/post.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/put.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/put.json
index 1506eedf206..b7e3f4c3c50 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/put.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/put.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/rest.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/rest.json
index 9c65d93ec99..aa3ce801ad8 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/rest.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/rest.json
@@ -20,11 +20,12 @@
     "skipBindingOnErrorCode": { "index": 5, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 6, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 7, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 8, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. This option will override what may be configured on a parent level. The default value is true." },
-    "tag": { "index": 9, "kind": "attribute", "displayName": "Tag", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To configure a special tag for the operations within this rest definition." },
-    "securityDefinitions": { "index": 10, "kind": "element", "displayName": "Security Definitions", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.model.rest.RestSecuritiesDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security definitions such as Basic, OAuth2 etc." },
-    "securityRequirements": { "index": 11, "kind": "element", "displayName": "Security Requirements", "label": "security", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.SecurityDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security requirement(s) for all endpoints." },
-    "id": { "index": 12, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 13, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 8, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 9, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. This option will override what may be configured on a parent level. The default value is true." },
+    "tag": { "index": 10, "kind": "attribute", "displayName": "Tag", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To configure a special tag for the operations within this rest definition." },
+    "securityDefinitions": { "index": 11, "kind": "element", "displayName": "Security Definitions", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.model.rest.RestSecuritiesDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security definitions such as Basic, OAuth2 etc." },
+    "securityRequirements": { "index": 12, "kind": "element", "displayName": "Security Requirements", "label": "security", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.SecurityDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security requirement(s) for all endpoints." },
+    "id": { "index": 13, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 14, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/restBinding.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/restBinding.json
index 45c2501be32..5db9c53f997 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/restBinding.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/restBinding.json
@@ -20,8 +20,9 @@
     "skipBindingOnErrorCode": { "index": 5, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 6, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 7, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. The default value is false." },
-    "component": { "index": 8, "kind": "attribute", "displayName": "Component", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the component name that this definition will apply to" },
-    "id": { "index": 9, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 10, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 8, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "component": { "index": 9, "kind": "attribute", "displayName": "Component", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the component name that this definition will apply to" },
+    "id": { "index": 10, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 11, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/restConfiguration.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/restConfiguration.json
index 1dfba27186e..400dbb21f9e 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/restConfiguration.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/restConfiguration.json
@@ -30,14 +30,15 @@
     "skipBindingOnErrorCode": { "index": 15, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise wil [...]
     "clientRequestValidation": { "index": 16, "kind": "attribute", "displayName": "Client Request Validation", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header m [...]
     "enableCORS": { "index": 17, "kind": "attribute", "displayName": "Enable CORS", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. The default value is false." },
-    "inlineRoutes": { "index": 18, "kind": "attribute", "displayName": "Inline Routes", "label": "consumer", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Inline routes in rest-dsl which are linked using direct endpoints. By default, each service in Rest DSL is an individual route, meaning that you would have at least two routes per service (rest-dsl, and the route li [...]
-    "jsonDataFormat": { "index": 19, "kind": "attribute", "displayName": "Json Data Format", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of specific json data format to use. By default jackson will be used. Important: This option is only for setting a custom name of the data format, not to refer to an existing data format instance." },
-    "xmlDataFormat": { "index": 20, "kind": "attribute", "displayName": "Xml Data Format", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of specific XML data format to use. By default jaxb will be used. Important: This option is only for setting a custom name of the data format, not to refer to an existing data format instance." },
-    "componentProperty": { "index": 21, "kind": "element", "displayName": "Component Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest component in use." },
-    "endpointProperty": { "index": 22, "kind": "element", "displayName": "Endpoint Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest endpoint in use." },
-    "consumerProperty": { "index": 23, "kind": "element", "displayName": "Consumer Property", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest consumer in use." },
-    "dataFormatProperty": { "index": 24, "kind": "element", "displayName": "Data Format Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the data formats in use. For example set property prettyPrint to true to have json outputted in pretty mode. The properties ca [...]
-    "apiProperty": { "index": 25, "kind": "element", "displayName": "Api Property", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the api documentation. For example set property api.title to my cool stuff" },
-    "corsHeaders": { "index": 26, "kind": "element", "displayName": "Cors Headers", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure custom CORS headers." }
+    "enableNoContentResponse": { "index": 18, "kind": "attribute", "displayName": "Enable No Content Response", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "inlineRoutes": { "index": 19, "kind": "attribute", "displayName": "Inline Routes", "label": "consumer", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Inline routes in rest-dsl which are linked using direct endpoints. By default, each service in Rest DSL is an individual route, meaning that you would have at least two routes per service (rest-dsl, and the route li [...]
+    "jsonDataFormat": { "index": 20, "kind": "attribute", "displayName": "Json Data Format", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of specific json data format to use. By default jackson will be used. Important: This option is only for setting a custom name of the data format, not to refer to an existing data format instance." },
+    "xmlDataFormat": { "index": 21, "kind": "attribute", "displayName": "Xml Data Format", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of specific XML data format to use. By default jaxb will be used. Important: This option is only for setting a custom name of the data format, not to refer to an existing data format instance." },
+    "componentProperty": { "index": 22, "kind": "element", "displayName": "Component Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest component in use." },
+    "endpointProperty": { "index": 23, "kind": "element", "displayName": "Endpoint Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest endpoint in use." },
+    "consumerProperty": { "index": 24, "kind": "element", "displayName": "Consumer Property", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest consumer in use." },
+    "dataFormatProperty": { "index": 25, "kind": "element", "displayName": "Data Format Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the data formats in use. For example set property prettyPrint to true to have json outputted in pretty mode. The properties ca [...]
+    "apiProperty": { "index": 26, "kind": "element", "displayName": "Api Property", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the api documentation. For example set property api.title to my cool stuff" },
+    "corsHeaders": { "index": 27, "kind": "element", "displayName": "Cors Headers", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure custom CORS headers." }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
index 4545637eac9..0be8875ac2e 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
@@ -13863,6 +13863,16 @@ Status 400 if validation error. Default value: false
         <xs:documentation xml:lang="en">
 <![CDATA[
 Whether to enable CORS headers in the HTTP response. The default value is false. Default value: false
+]]>
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="enableNoContentResponse" type="xs:string">
+      <xs:annotation>
+        <xs:documentation xml:lang="en">
+<![CDATA[
+Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The
+default value is false. Default value: false
 ]]>
         </xs:documentation>
       </xs:annotation>
@@ -14023,6 +14033,16 @@ Status 400 if validation error. Default value: false
 <![CDATA[
 Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level
 The default value is false. Default value: false
+]]>
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="enableNoContentResponse" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en">
+<![CDATA[
+Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The
+default value is false. Default value: false
 ]]>
             </xs:documentation>
           </xs:annotation>
@@ -14357,6 +14377,16 @@ Status 400 if validation error. Default value: false
 <![CDATA[
 Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level
 The default value is false. Default value: false
+]]>
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="enableNoContentResponse" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en">
+<![CDATA[
+Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The
+default value is false. Default value: false
 ]]>
             </xs:documentation>
           </xs:annotation>
@@ -16225,6 +16255,16 @@ Status 400 if validation error. Default value: false
             <xs:documentation xml:lang="en">
 <![CDATA[
 Whether to enable CORS headers in the HTTP response. The default value is false. Default value: false
+]]>
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="enableNoContentResponse" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en">
+<![CDATA[
+Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The
+default value is false. Default value: false
 ]]>
             </xs:documentation>
           </xs:annotation>
diff --git a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/Address.java b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/Address.java
new file mode 100644
index 00000000000..1f79ffb2723
--- /dev/null
+++ b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/Address.java
@@ -0,0 +1,72 @@
+/*
+ * 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.component.jetty.rest;
+
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlType;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Address")
+public class Address {
+
+    @XmlElement(namespace = "http://www.camel.apache.org/jaxb/example/address/1")
+
+    private String street;
+    @XmlElement(namespace = "http://www.camel.apache.org/jaxb/example/address/1")
+
+    private String streetNumber;
+    @XmlElement(namespace = "http://www.camel.apache.org/jaxb/example/address/1")
+
+    private String zip;
+    @XmlElement(namespace = "http://www.camel.apache.org/jaxb/example/address/1")
+
+    private String city;
+
+    public String getStreet() {
+        return street;
+    }
+
+    public String getStreetNumber() {
+        return streetNumber;
+    }
+
+    public String getZip() {
+        return zip;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setStreet(String street) {
+        this.street = street;
+    }
+
+    public void setStreetNumber(String streetNumber) {
+        this.streetNumber = streetNumber;
+    }
+
+    public void setZip(String zip) {
+        this.zip = zip;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+}
diff --git a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestJettyNoContentRestConfigTest.java b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestJettyNoContentRestConfigTest.java
new file mode 100644
index 00000000000..1110bf38455
--- /dev/null
+++ b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestJettyNoContentRestConfigTest.java
@@ -0,0 +1,194 @@
+/*
+ * 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.component.jetty.rest;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.apache.camel.converter.jaxb.JaxbConstants;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.apache.camel.support.MessageHelper;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class RestJettyNoContentRestConfigTest extends BaseJettyTest {
+
+    @Test
+    public void testEmptyJson204ConfigNoContentEnabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v1/empty/country", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(204, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertTrue(exchange.getMessage().getBody() == null);
+    }
+
+    @Test
+    public void testEmptyXml204ConfigNoContentEnabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v1/empty/address", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(204, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertTrue(exchange.getMessage().getBody() == null);
+    }
+
+    @Test
+    public void testEmptyJson200RestConfigNoContentDisabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v2/empty/country", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertTrue(MessageHelper.extractBodyAsString(exchange.getMessage()).equals("[]"));
+    }
+
+    @Test
+    public void testEmptyXml200RestConfigNoContentDisabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v2/empty/address", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
+                     "<address:address xmlns:address=\"http://www.camel.apache.org/jaxb/example/address/1\"/>\n",
+                MessageHelper.extractBodyAsString(exchange.getMessage()));
+    }
+
+    @Test
+    public void testEmpty200VerbNoContentDisabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v3/empty/country", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertTrue(MessageHelper.extractBodyAsString(exchange.getMessage()).equals("[]"));
+    }
+
+    @Test
+    public void testJson200ConfigNoContentEnabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/country", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertEquals("{\"iso\":\"EN\",\"country\":\"England\"}", MessageHelper.extractBodyAsString(exchange.getMessage()));
+    }
+
+    @Test
+    public void testXml200ConfigNoContentEnabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/address", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
+                     "<address:address xmlns:address=\"http://www.camel.apache.org/jaxb/example/address/1\">\n" +
+                     "    <address:street>Main Street</address:street>\n" +
+                     "    <address:streetNumber>3a</address:streetNumber>\n" +
+                     "    <address:zip>65843</address:zip>\n" +
+                     "    <address:city>Sulzbach</address:city>\n" +
+                     "</address:address>\n",
+                MessageHelper.extractBodyAsString(exchange.getMessage()));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                restConfiguration().component("jetty").host("localhost").port(getPort())
+                        .bindingMode(RestBindingMode.auto).enableNoContentResponse(true);
+
+                rest("/v1/empty")
+                        .get("/country").to("direct:v1country")
+                        .get("/address").to("direct:v1address").produces("application/xml").type(Address.class);
+
+                rest("/v2/empty/").enableNoContentResponse(false)
+                        .get("/country").to("direct:v2country")
+                        .get("/address").to("direct:v2address").produces("application/xml").type(Address.class);
+
+                rest("/v3/empty")
+                        .get("/country").to("direct:v3country").enableNoContentResponse(false);
+
+                rest()
+                        .get("/country").to("direct:v4country")
+                        .get("/address").to("direct:v3address").produces("application/xml").type(Address.class);
+
+                from("direct:v1country").transform().constant(new java.util.ArrayList<CountryPojo>());
+                from("direct:v2country").transform().constant(new java.util.ArrayList<CountryPojo>());
+                from("direct:v3country").transform().constant(new java.util.ArrayList<CountryPojo>());
+
+                CountryPojo country = new CountryPojo();
+                country.setIso("EN");
+                country.setCountry("England");
+                from("direct:v4country").transform().constant(country);
+
+                Address emptyAddress = new Address();
+                from("direct:v1address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.jetty.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(emptyAddress);
+
+                from("direct:v2address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.jetty.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(emptyAddress);
+
+                Address address = new Address();
+                address.setStreet("Main Street");
+                address.setStreetNumber("3a");
+                address.setZip("65843");
+                address.setCity("Sulzbach");
+                from("direct:v3address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.jetty.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(address);
+            }
+        };
+    }
+}
diff --git a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestJettyNoContentTest.java b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestJettyNoContentTest.java
new file mode 100644
index 00000000000..a0395babbdc
--- /dev/null
+++ b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestJettyNoContentTest.java
@@ -0,0 +1,194 @@
+/*
+ * 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.component.jetty.rest;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.apache.camel.converter.jaxb.JaxbConstants;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.apache.camel.support.MessageHelper;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class RestJettyNoContentTest extends BaseJettyTest {
+
+    @Test
+    public void testEmptyJson200ConfigNoContentDisabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v1/empty/country", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertTrue(MessageHelper.extractBodyAsString(exchange.getMessage()).equals("[]"));
+    }
+
+    @Test
+    public void testEmptyXml200ConfigNoContentDisabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v1/empty/address", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
+                     "<address:address xmlns:address=\"http://www.camel.apache.org/jaxb/example/address/1\"/>\n",
+                MessageHelper.extractBodyAsString(exchange.getMessage()));
+    }
+
+    @Test
+    public void testEmptyJson204RestConfigNoContentEnabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v2/empty/country", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(204, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertTrue(exchange.getMessage().getBody() == null);
+    }
+
+    @Test
+    public void testEmptyXml204RestConfigNoContentEnabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v2/empty/address", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(204, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertTrue(exchange.getMessage().getBody() == null);
+    }
+
+    @Test
+    public void testEmpty204VerbNoContentEnabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/v3/empty/country", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(204, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertTrue(exchange.getMessage().getBody() == null);
+    }
+
+    @Test
+    public void testJson200ConfigNoContentEnabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/country", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertEquals("{\"iso\":\"EN\",\"country\":\"England\"}", MessageHelper.extractBodyAsString(exchange.getMessage()));
+    }
+
+    @Test
+    public void testXml200ConfigNoContentEnabled() throws Exception {
+        Exchange exchange = template.request("http://localhost:" + getPort() + "/address", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET");
+            }
+        });
+
+        assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE));
+        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
+                     "<address:address xmlns:address=\"http://www.camel.apache.org/jaxb/example/address/1\">\n" +
+                     "    <address:street>Main Street</address:street>\n" +
+                     "    <address:streetNumber>3a</address:streetNumber>\n" +
+                     "    <address:zip>65843</address:zip>\n" +
+                     "    <address:city>Sulzbach</address:city>\n" +
+                     "</address:address>\n",
+                MessageHelper.extractBodyAsString(exchange.getMessage()));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                restConfiguration().component("jetty").host("localhost").port(getPort())
+                        .bindingMode(RestBindingMode.auto);
+
+                rest("/v1/empty")
+                        .get("/country").to("direct:v1country")
+                        .get("/address").to("direct:v1address").produces("application/xml").type(Address.class);
+
+                rest("/v2/empty/").enableNoContentResponse(true)
+                        .get("/country").to("direct:v2country")
+                        .get("/address").to("direct:v2address").produces("application/xml").type(Address.class);
+
+                rest("/v3/empty")
+                        .get("/country").to("direct:v3country").enableNoContentResponse(true);
+
+                rest().enableNoContentResponse(true)
+                        .get("/country").to("direct:v4country")
+                        .get("/address").to("direct:v3address").produces("application/xml").type(Address.class);
+
+                from("direct:v1country").transform().constant(new java.util.ArrayList<CountryPojo>());
+                from("direct:v2country").transform().constant(new java.util.ArrayList<CountryPojo>());
+                from("direct:v3country").transform().constant(new java.util.ArrayList<CountryPojo>());
+
+                CountryPojo country = new CountryPojo();
+                country.setIso("EN");
+                country.setCountry("England");
+                from("direct:v4country").transform().constant(country);
+
+                Address emptyAddress = new Address();
+                from("direct:v1address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.jetty.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(emptyAddress);
+
+                from("direct:v2address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.jetty.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(emptyAddress);
+
+                Address address = new Address();
+                address.setStreet("Main Street");
+                address.setStreetNumber("3a");
+                address.setZip("65843");
+                address.setCity("Sulzbach");
+                from("direct:v3address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.jetty.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(address);
+            }
+        };
+    }
+}
diff --git a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/package-info.java b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/package-info.java
new file mode 100644
index 00000000000..fa913c9b645
--- /dev/null
+++ b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/package-info.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+@XmlSchema(
+           xmlns = {
+                   @XmlNs(prefix = "address", namespaceURI = "http://www.camel.apache.org/jaxb/example/address/1")
+           })
+package org.apache.camel.component.jetty.rest;
+
+import jakarta.xml.bind.annotation.XmlNs;
+import jakarta.xml.bind.annotation.XmlSchema;
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/Address.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/Address.java
new file mode 100644
index 00000000000..9eef046b422
--- /dev/null
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/Address.java
@@ -0,0 +1,72 @@
+/*
+ * 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.component.servlet.rest;
+
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlType;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Address")
+public class Address {
+
+    @XmlElement(namespace = "http://www.camel.apache.org/jaxb/example/address/1")
+
+    private String street;
+    @XmlElement(namespace = "http://www.camel.apache.org/jaxb/example/address/1")
+
+    private String streetNumber;
+    @XmlElement(namespace = "http://www.camel.apache.org/jaxb/example/address/1")
+
+    private String zip;
+    @XmlElement(namespace = "http://www.camel.apache.org/jaxb/example/address/1")
+
+    private String city;
+
+    public String getStreet() {
+        return street;
+    }
+
+    public String getStreetNumber() {
+        return streetNumber;
+    }
+
+    public String getZip() {
+        return zip;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setStreet(String street) {
+        this.street = street;
+    }
+
+    public void setStreetNumber(String streetNumber) {
+        this.streetNumber = streetNumber;
+    }
+
+    public void setZip(String zip) {
+        this.zip = zip;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+}
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/RestServletNoContentRestConfigTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/RestServletNoContentRestConfigTest.java
new file mode 100644
index 00000000000..78723c71475
--- /dev/null
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/RestServletNoContentRestConfigTest.java
@@ -0,0 +1,164 @@
+/*
+ * 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.component.servlet.rest;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.servlet.ServletCamelRouterTestSupport;
+import org.apache.camel.converter.jaxb.JaxbConstants;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class RestServletNoContentRestConfigTest extends ServletCamelRouterTestSupport {
+
+    @Test
+    public void testEmptyJson204ConfigNoContentEnabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v1/empty/country");
+        WebResponse response = query(req, false);
+
+        assertEquals(204, response.getResponseCode());
+        assertTrue(response.getText().isEmpty());
+    }
+
+    @Test
+    public void testEmptyXml204ConfigNoContentEnabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v1/empty/address");
+        WebResponse response = query(req, false);
+
+        assertEquals(204, response.getResponseCode());
+        assertTrue(response.getText().isEmpty());
+    }
+
+    @Test
+    public void testEmptyJson200RestConfigNoContentDisabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v2/empty/country");
+        WebResponse response = query(req, false);
+
+        assertEquals(200, response.getResponseCode());
+        assertTrue(response.getText().equals("[]"));
+    }
+
+    @Test
+    public void testEmptyXml200RestConfigNoContentDisabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v2/empty/address");
+        WebResponse response = query(req, false);
+
+        assertEquals(200, response.getResponseCode());
+        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
+                     "<address:address xmlns:address=\"http://www.camel.apache.org/jaxb/example/address/1\"/>\n",
+                response.getText());
+    }
+
+    @Test
+    public void testEmpty200VerbNoContentDisabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v3/empty/country");
+        WebResponse response = query(req, false);
+
+        assertEquals(200, response.getResponseCode());
+        assertTrue(response.getText().equals("[]"));
+    }
+
+    @Test
+    public void testJson200ConfigNoContentEnabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/country");
+        WebResponse response = query(req, false);
+
+        assertEquals(200, response.getResponseCode());
+        assertEquals("{\"iso\":\"EN\",\"country\":\"England\"}",
+                response.getText());
+    }
+
+    @Test
+    public void testXml200ConfigNoContentEnabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/address");
+        WebResponse response = query(req, false);
+
+        assertEquals(200, response.getResponseCode());
+        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
+                     "<address:address xmlns:address=\"http://www.camel.apache.org/jaxb/example/address/1\">\n" +
+                     "    <address:street>Main Street</address:street>\n" +
+                     "    <address:streetNumber>3a</address:streetNumber>\n" +
+                     "    <address:zip>65843</address:zip>\n" +
+                     "    <address:city>Sulzbach</address:city>\n" +
+                     "</address:address>\n",
+                response.getText());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                restConfiguration().component("servlet").host("localhost")
+                        .bindingMode(RestBindingMode.auto).enableNoContentResponse(true);
+
+                rest("/v1/empty")
+                        .get("/country").to("direct:v1country")
+                        .get("/address").to("direct:v1address").produces("application/xml").type(Address.class);
+
+                rest("/v2/empty/").enableNoContentResponse(false)
+                        .get("/country").to("direct:v2country")
+                        .get("/address").to("direct:v2address").produces("application/xml").type(Address.class);
+
+                rest("/v3/empty")
+                        .get("/country").to("direct:v3country").enableNoContentResponse(false);
+
+                rest()
+                        .get("/country").to("direct:v4country")
+                        .get("/address").to("direct:v3address").produces("application/xml").type(Address.class);
+
+                from("direct:v1country").transform().constant(new java.util.ArrayList<CountryPojo>());
+                from("direct:v2country").transform().constant(new java.util.ArrayList<CountryPojo>());
+                from("direct:v3country").transform().constant(new java.util.ArrayList<CountryPojo>());
+
+                CountryPojo country = new CountryPojo();
+                country.setIso("EN");
+                country.setCountry("England");
+                from("direct:v4country").transform().constant(country);
+
+                Address emptyAddress = new Address();
+                from("direct:v1address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.servlet.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(emptyAddress);
+
+                from("direct:v2address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.servlet.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(emptyAddress);
+
+                Address address = new Address();
+                address.setStreet("Main Street");
+                address.setStreetNumber("3a");
+                address.setZip("65843");
+                address.setCity("Sulzbach");
+                from("direct:v3address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.servlet.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(address);
+            }
+        };
+    }
+}
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/RestServletNoContentTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/RestServletNoContentTest.java
new file mode 100644
index 00000000000..65ee18339a8
--- /dev/null
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/RestServletNoContentTest.java
@@ -0,0 +1,163 @@
+/*
+ * 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.component.servlet.rest;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.servlet.ServletCamelRouterTestSupport;
+import org.apache.camel.converter.jaxb.JaxbConstants;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class RestServletNoContentTest extends ServletCamelRouterTestSupport {
+
+    @Test
+    public void testEmptyJson200ConfigNoContentDisabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v1/empty/country");
+        WebResponse response = query(req, false);
+
+        assertEquals(200, response.getResponseCode());
+        assertTrue(response.getText().equals("[]"));
+    }
+
+    @Test
+    public void testEmptyXml200ConfigNoContentDisabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v1/empty/address");
+        WebResponse response = query(req, false);
+
+        assertEquals(200, response.getResponseCode());
+        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
+                     "<address:address xmlns:address=\"http://www.camel.apache.org/jaxb/example/address/1\"/>\n",
+                response.getText());
+    }
+
+    @Test
+    public void testEmptyJson204RestConfigNoContentEnabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v2/empty/country");
+        WebResponse response = query(req, false);
+
+        assertEquals(204, response.getResponseCode());
+        assertTrue(response.getText().isEmpty());
+    }
+
+    @Test
+    public void testEmptyXml204RestConfigNoContentEnabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v2/empty/address");
+        WebResponse response = query(req, false);
+
+        assertEquals(204, response.getResponseCode());
+        assertTrue(response.getText().isEmpty());
+    }
+
+    @Test
+    public void testEmpty204VerbNoContentEnabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/v3/empty/country");
+        WebResponse response = query(req, false);
+
+        assertEquals(204, response.getResponseCode());
+        assertTrue(response.getText().isEmpty());
+    }
+
+    @Test
+    public void testJson200ConfigNoContentEnabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/country");
+        WebResponse response = query(req, false);
+
+        assertEquals(200, response.getResponseCode());
+        assertEquals("{\"iso\":\"EN\",\"country\":\"England\"}", response.getText());
+    }
+
+    @Test
+    public void testXml200ConfigNoContentEnabled() throws Exception {
+        WebRequest req = new GetMethodWebRequest(contextUrl + "/services/address");
+        WebResponse response = query(req, false);
+
+        assertEquals(200, response.getResponseCode());
+        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
+                     "<address:address xmlns:address=\"http://www.camel.apache.org/jaxb/example/address/1\">\n" +
+                     "    <address:street>Main Street</address:street>\n" +
+                     "    <address:streetNumber>3a</address:streetNumber>\n" +
+                     "    <address:zip>65843</address:zip>\n" +
+                     "    <address:city>Sulzbach</address:city>\n" +
+                     "</address:address>\n",
+                response.getText());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                restConfiguration().component("servlet").host("localhost")
+                        .bindingMode(RestBindingMode.auto);
+
+                rest("/v1/empty")
+                        .get("/country").to("direct:v1country")
+                        .get("/address").to("direct:v1address").produces("application/xml").type(Address.class);
+
+                rest("/v2/empty/").enableNoContentResponse(true)
+                        .get("/country").to("direct:v2country")
+                        .get("/address").to("direct:v2address").produces("application/xml").type(Address.class);
+
+                rest("/v3/empty")
+                        .get("/country").to("direct:v3country").enableNoContentResponse(true);
+
+                rest().enableNoContentResponse(true)
+                        .get("/country").to("direct:v4country")
+                        .get("/address").to("direct:v3address").produces("application/xml").type(Address.class);
+
+                from("direct:v1country").transform().constant(new java.util.ArrayList<CountryPojo>());
+                from("direct:v2country").transform().constant(new java.util.ArrayList<CountryPojo>());
+                from("direct:v3country").transform().constant(new java.util.ArrayList<CountryPojo>());
+
+                CountryPojo country = new CountryPojo();
+                country.setIso("EN");
+                country.setCountry("England");
+                from("direct:v4country").transform().constant(country);
+
+                Address emptyAddress = new Address();
+                from("direct:v1address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.servlet.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(emptyAddress);
+
+                from("direct:v2address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.servlet.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(emptyAddress);
+
+                Address address = new Address();
+                address.setStreet("Main Street");
+                address.setStreetNumber("3a");
+                address.setZip("65843");
+                address.setCity("Sulzbach");
+                from("direct:v3address")
+                        .setHeader(JaxbConstants.JAXB_PART_CLASS, simple("org.apache.camel.component.servlet.rest.Address"))
+                        .setHeader(JaxbConstants.JAXB_PART_NAMESPACE,
+                                simple("{http://www.camel.apache.org/jaxb/example/address/1}address"))
+                        .transform()
+                        .constant(address);
+            }
+        };
+    }
+}
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/package-info.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/package-info.java
new file mode 100644
index 00000000000..96ea48a34cf
--- /dev/null
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/rest/package-info.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+@XmlSchema(
+           xmlns = {
+                   @XmlNs(prefix = "address", namespaceURI = "http://www.camel.apache.org/jaxb/example/address/1")
+           })
+package org.apache.camel.component.servlet.rest;
+
+import jakarta.xml.bind.annotation.XmlNs;
+import jakarta.xml.bind.annotation.XmlSchema;
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/RestConfiguration.java b/core/camel-api/src/main/java/org/apache/camel/spi/RestConfiguration.java
index 4789476bc67..4f929439f6c 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/RestConfiguration.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/RestConfiguration.java
@@ -67,6 +67,7 @@ public class RestConfiguration {
     private boolean clientRequestValidation;
     private boolean inlineRoutes;
     private boolean enableCORS;
+    private boolean enableNoContentResponse;
     private String jsonDataFormat;
     private String xmlDataFormat;
     private Map<String, Object> componentProperties;
@@ -419,6 +420,21 @@ public class RestConfiguration {
         this.enableCORS = enableCORS;
     }
 
+    public boolean isEnableNoContentResponse() {
+        return enableNoContentResponse;
+    }
+
+    /**
+     * Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object.
+     * <p/>
+     * The default value is <tt>false</tt>.
+     *
+     * @param enableNoContentResponse <tt>true</tt> to enable HTTP 204 response codes
+     */
+    public void setEnableNoContentResponse(boolean enableNoContentResponse) {
+        this.enableNoContentResponse = enableNoContentResponse;
+    }
+
     public boolean isInlineRoutes() {
         return inlineRoutes;
     }
diff --git a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/RestConfigurationConfigurer.java b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/RestConfigurationConfigurer.java
index d0f21a1e49c..bfef8ab1c57 100644
--- a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/RestConfigurationConfigurer.java
+++ b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/RestConfigurationConfigurer.java
@@ -51,6 +51,8 @@ public class RestConfigurationConfigurer extends org.apache.camel.support.compon
         case "DataFormatProperties": target.setDataFormatProperties(property(camelContext, java.util.Map.class, value)); return true;
         case "enablecors":
         case "EnableCORS": target.setEnableCORS(property(camelContext, boolean.class, value)); return true;
+        case "enablenocontentresponse":
+        case "EnableNoContentResponse": target.setEnableNoContentResponse(property(camelContext, boolean.class, value)); return true;
         case "endpointproperties":
         case "EndpointProperties": target.setEndpointProperties(property(camelContext, java.util.Map.class, value)); return true;
         case "host":
@@ -112,6 +114,8 @@ public class RestConfigurationConfigurer extends org.apache.camel.support.compon
         case "DataFormatProperties": return java.util.Map.class;
         case "enablecors":
         case "EnableCORS": return boolean.class;
+        case "enablenocontentresponse":
+        case "EnableNoContentResponse": return boolean.class;
         case "endpointproperties":
         case "EndpointProperties": return java.util.Map.class;
         case "host":
@@ -174,6 +178,8 @@ public class RestConfigurationConfigurer extends org.apache.camel.support.compon
         case "DataFormatProperties": return target.getDataFormatProperties();
         case "enablecors":
         case "EnableCORS": return target.isEnableCORS();
+        case "enablenocontentresponse":
+        case "EnableNoContentResponse": return target.isEnableNoContentResponse();
         case "endpointproperties":
         case "EndpointProperties": return target.getEndpointProperties();
         case "host":
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/delete.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/delete.json
index 8054f806f96..623137b1996 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/delete.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/delete.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/get.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/get.json
index 0f0a11e0999..fc35bc34cda 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/get.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/get.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/head.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/head.json
index 4ca8d49f83b..c461d288a9b 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/head.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/head.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/patch.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/patch.json
index 0fb0cb0c911..6c19d4539b7 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/patch.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/patch.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/post.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/post.json
index 93ade5c6033..07f59a85143 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/post.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/post.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/put.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/put.json
index 1506eedf206..b7e3f4c3c50 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/put.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/put.json
@@ -23,10 +23,11 @@
     "skipBindingOnErrorCode": { "index": 8, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 9, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 10, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 11, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
-    "deprecated": { "index": 12, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
-    "routeId": { "index": 13, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
-    "id": { "index": 14, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 15, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 11, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 12, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. The default value is true." },
+    "deprecated": { "index": 13, "kind": "attribute", "displayName": "Deprecated", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Marks this rest operation as deprecated in OpenApi documentation." },
+    "routeId": { "index": 14, "kind": "attribute", "displayName": "Route Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of the route" },
+    "id": { "index": 15, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 16, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/rest.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/rest.json
index 9c65d93ec99..aa3ce801ad8 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/rest.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/rest.json
@@ -20,11 +20,12 @@
     "skipBindingOnErrorCode": { "index": 5, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 6, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 7, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. This option will override what may be configured on a parent level The default value is false." },
-    "apiDocs": { "index": 8, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. This option will override what may be configured on a parent level. The default value is true." },
-    "tag": { "index": 9, "kind": "attribute", "displayName": "Tag", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To configure a special tag for the operations within this rest definition." },
-    "securityDefinitions": { "index": 10, "kind": "element", "displayName": "Security Definitions", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.model.rest.RestSecuritiesDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security definitions such as Basic, OAuth2 etc." },
-    "securityRequirements": { "index": 11, "kind": "element", "displayName": "Security Requirements", "label": "security", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.SecurityDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security requirement(s) for all endpoints." },
-    "id": { "index": 12, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 13, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 8, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "apiDocs": { "index": 9, "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. This option will override what may be configured on a parent level. The default value is true." },
+    "tag": { "index": 10, "kind": "attribute", "displayName": "Tag", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To configure a special tag for the operations within this rest definition." },
+    "securityDefinitions": { "index": 11, "kind": "element", "displayName": "Security Definitions", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.model.rest.RestSecuritiesDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security definitions such as Basic, OAuth2 etc." },
+    "securityRequirements": { "index": 12, "kind": "element", "displayName": "Security Requirements", "label": "security", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.SecurityDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security requirement(s) for all endpoints." },
+    "id": { "index": 13, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 14, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/restBinding.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/restBinding.json
index 45c2501be32..5db9c53f997 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/restBinding.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/restBinding.json
@@ -20,8 +20,9 @@
     "skipBindingOnErrorCode": { "index": 5, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise will [...]
     "clientRequestValidation": { "index": 6, "kind": "attribute", "displayName": "Client Request Validation", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header matches wha [...]
     "enableCORS": { "index": 7, "kind": "attribute", "displayName": "Enable CORS", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. The default value is false." },
-    "component": { "index": 8, "kind": "attribute", "displayName": "Component", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the component name that this definition will apply to" },
-    "id": { "index": 9, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
-    "description": { "index": 10, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+    "enableNoContentResponse": { "index": 8, "kind": "attribute", "displayName": "Enable No Content Response", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "component": { "index": 9, "kind": "attribute", "displayName": "Component", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the component name that this definition will apply to" },
+    "id": { "index": 10, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 11, "kind": "element", "displayName": "Description", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/restConfiguration.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/restConfiguration.json
index 1dfba27186e..400dbb21f9e 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/restConfiguration.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/restConfiguration.json
@@ -30,14 +30,15 @@
     "skipBindingOnErrorCode": { "index": 15, "kind": "attribute", "displayName": "Skip Binding On Error Code", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json \/ xml etc, as success messages otherwise wil [...]
     "clientRequestValidation": { "index": 16, "kind": "attribute", "displayName": "Client Request Validation", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable validation of the client request to check: 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept header m [...]
     "enableCORS": { "index": 17, "kind": "attribute", "displayName": "Enable CORS", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable CORS headers in the HTTP response. The default value is false." },
-    "inlineRoutes": { "index": 18, "kind": "attribute", "displayName": "Inline Routes", "label": "consumer", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Inline routes in rest-dsl which are linked using direct endpoints. By default, each service in Rest DSL is an individual route, meaning that you would have at least two routes per service (rest-dsl, and the route li [...]
-    "jsonDataFormat": { "index": 19, "kind": "attribute", "displayName": "Json Data Format", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of specific json data format to use. By default jackson will be used. Important: This option is only for setting a custom name of the data format, not to refer to an existing data format instance." },
-    "xmlDataFormat": { "index": 20, "kind": "attribute", "displayName": "Xml Data Format", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of specific XML data format to use. By default jaxb will be used. Important: This option is only for setting a custom name of the data format, not to refer to an existing data format instance." },
-    "componentProperty": { "index": 21, "kind": "element", "displayName": "Component Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest component in use." },
-    "endpointProperty": { "index": 22, "kind": "element", "displayName": "Endpoint Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest endpoint in use." },
-    "consumerProperty": { "index": 23, "kind": "element", "displayName": "Consumer Property", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest consumer in use." },
-    "dataFormatProperty": { "index": 24, "kind": "element", "displayName": "Data Format Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the data formats in use. For example set property prettyPrint to true to have json outputted in pretty mode. The properties ca [...]
-    "apiProperty": { "index": 25, "kind": "element", "displayName": "Api Property", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the api documentation. For example set property api.title to my cool stuff" },
-    "corsHeaders": { "index": 26, "kind": "element", "displayName": "Cors Headers", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure custom CORS headers." }
+    "enableNoContentResponse": { "index": 18, "kind": "attribute", "displayName": "Enable No Content Response", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false." },
+    "inlineRoutes": { "index": 19, "kind": "attribute", "displayName": "Inline Routes", "label": "consumer", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Inline routes in rest-dsl which are linked using direct endpoints. By default, each service in Rest DSL is an individual route, meaning that you would have at least two routes per service (rest-dsl, and the route li [...]
+    "jsonDataFormat": { "index": 20, "kind": "attribute", "displayName": "Json Data Format", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of specific json data format to use. By default jackson will be used. Important: This option is only for setting a custom name of the data format, not to refer to an existing data format instance." },
+    "xmlDataFormat": { "index": 21, "kind": "attribute", "displayName": "Xml Data Format", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of specific XML data format to use. By default jaxb will be used. Important: This option is only for setting a custom name of the data format, not to refer to an existing data format instance." },
+    "componentProperty": { "index": 22, "kind": "element", "displayName": "Component Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest component in use." },
+    "endpointProperty": { "index": 23, "kind": "element", "displayName": "Endpoint Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest endpoint in use." },
+    "consumerProperty": { "index": 24, "kind": "element", "displayName": "Consumer Property", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the rest consumer in use." },
+    "dataFormatProperty": { "index": 25, "kind": "element", "displayName": "Data Format Property", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the data formats in use. For example set property prettyPrint to true to have json outputted in pretty mode. The properties ca [...]
+    "apiProperty": { "index": 26, "kind": "element", "displayName": "Api Property", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure as many additional properties for the api documentation. For example set property api.title to my cool stuff" },
+    "corsHeaders": { "index": 27, "kind": "element", "displayName": "Cors Headers", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.RestPropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure custom CORS headers." }
   }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
index a5e236d1b17..b0cf3aff96c 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
@@ -74,6 +74,9 @@ public class RestBindingDefinition extends OptionalIdentifiedDefinition<RestBind
     @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "false")
     private String enableCORS;
     @XmlAttribute
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "false")
+    private String enableNoContentResponse;
+    @XmlAttribute
     @Metadata(label = "advanced")
     private String component;
 
@@ -284,6 +287,19 @@ public class RestBindingDefinition extends OptionalIdentifiedDefinition<RestBind
         this.enableCORS = enableCORS;
     }
 
+    public String getEnableNoContentResponse() {
+        return enableNoContentResponse;
+    }
+
+    /**
+     * Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object.
+     * <p/>
+     * The default value is false.
+     */
+    public void setEnableNoContentResponse(String enableNoContentResponse) {
+        this.enableNoContentResponse = enableNoContentResponse;
+    }
+
     @Override
     public String getShortName() {
         return "restBinding";
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
index e7a1d937c58..71be26d83c8 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
@@ -92,6 +92,9 @@ public class RestConfigurationDefinition {
     @Metadata(label = "consumer,advanced", javaType = "java.lang.Boolean", defaultValue = "false")
     private String enableCORS;
     @XmlAttribute
+    @Metadata(label = "consumer,advanced", javaType = "java.lang.Boolean", defaultValue = "false")
+    private String enableNoContentResponse;
+    @XmlAttribute
     @Metadata(label = "consumer", javaType = "java.lang.Boolean", defaultValue = "false")
     private String inlineRoutes;
     @XmlAttribute
@@ -351,6 +354,19 @@ public class RestConfigurationDefinition {
         this.enableCORS = enableCORS;
     }
 
+    public String getEnableNoContentResponse() {
+        return enableNoContentResponse;
+    }
+
+    /**
+     * Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object.
+     * <p/>
+     * The default value is false.
+     */
+    public void setEnableNoContentResponse(String enableNoContentResponse) {
+        this.enableNoContentResponse = enableNoContentResponse;
+    }
+
     public String getInlineRoutes() {
         return inlineRoutes;
     }
@@ -699,6 +715,24 @@ public class RestConfigurationDefinition {
         return this;
     }
 
+    /**
+     * To Specify whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML
+     * root object.
+     */
+    public RestConfigurationDefinition enableNoContentResponse(boolean enableNoContentResponse) {
+        setEnableNoContentResponse(enableNoContentResponse ? "true" : "false");
+        return this;
+    }
+
+    /**
+     * To specify whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML
+     * root object.
+     */
+    public RestConfigurationDefinition enableNoContentResponse(String enableNoContentResponse) {
+        setEnableNoContentResponse(enableNoContentResponse);
+        return this;
+    }
+
     /**
      * Inline routes in rest-dsl which are linked using direct endpoints.
      *
@@ -918,6 +952,9 @@ public class RestConfigurationDefinition {
         if (enableCORS != null) {
             target.setEnableCORS(CamelContextHelper.parseBoolean(context, enableCORS));
         }
+        if (enableNoContentResponse != null) {
+            target.setEnableNoContentResponse(CamelContextHelper.parseBoolean(context, enableNoContentResponse));
+        }
         if (inlineRoutes != null) {
             target.setInlineRoutes(CamelContextHelper.parseBoolean(context, inlineRoutes));
         }
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 50f62993466..b91846cde8b 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
@@ -79,6 +79,9 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
     @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "false")
     private String enableCORS;
     @XmlAttribute
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "false")
+    private String enableNoContentResponse;
+    @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String apiDocs;
     @XmlAttribute
@@ -252,6 +255,19 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
         this.enableCORS = enableCORS;
     }
 
+    public String getEnableNoContentResponse() {
+        return enableNoContentResponse;
+    }
+
+    /**
+     * Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object.
+     * <p/>
+     * The default value is false.
+     */
+    public void setEnableNoContentResponse(String enableNoContentResponse) {
+        this.enableNoContentResponse = enableNoContentResponse;
+    }
+
     public String getApiDocs() {
         return apiDocs;
     }
@@ -621,6 +637,18 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
         return this;
     }
 
+    public RestDefinition enableNoContentResponse(boolean enableNoContentResponse) {
+        if (getVerbs().isEmpty()) {
+            this.enableNoContentResponse = Boolean.toString(enableNoContentResponse);
+        } else {
+            // add on last verb as that is how the Java DSL works
+            VerbDefinition verb = getVerbs().get(getVerbs().size() - 1);
+            verb.setEnableNoContentResponse(Boolean.toString(enableNoContentResponse));
+        }
+
+        return this;
+    }
+
     /**
      * Include or exclude the current Rest Definition in API documentation.
      * <p/>
@@ -908,6 +936,11 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
             } else {
                 binding.setEnableCORS(getEnableCORS());
             }
+            if (verb.getEnableNoContentResponse() != null) {
+                binding.setEnableNoContentResponse(verb.getEnableNoContentResponse());
+            } else {
+                binding.setEnableNoContentResponse(getEnableNoContentResponse());
+            }
             for (ParamDefinition param : verb.getParams()) {
                 // register all the default values for the query and header parameters
                 RestParamType type = param.getType();
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/VerbDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/VerbDefinition.java
index 98fd38010fb..de629aef4ce 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/VerbDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/VerbDefinition.java
@@ -79,6 +79,9 @@ public abstract class VerbDefinition extends OptionalIdentifiedDefinition<VerbDe
     @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "false")
     private String enableCORS;
     @XmlAttribute
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "false")
+    private String enableNoContentResponse;
+    @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String apiDocs;
     @XmlAttribute
@@ -262,6 +265,19 @@ public abstract class VerbDefinition extends OptionalIdentifiedDefinition<VerbDe
         this.enableCORS = enableCORS;
     }
 
+    public String getEnableNoContentResponse() {
+        return enableNoContentResponse;
+    }
+
+    /**
+     * Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object.
+     * <p/>
+     * The default value is false.
+     */
+    public void setEnableNoContentResponse(String enableNoContentResponse) {
+        this.enableNoContentResponse = enableNoContentResponse;
+    }
+
     public String getType() {
         return type;
     }
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/RestBindingAdvice.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/RestBindingAdvice.java
index ee00c09db3e..3b28db61edd 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/RestBindingAdvice.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/RestBindingAdvice.java
@@ -66,6 +66,7 @@ public class RestBindingAdvice implements CamelInternalProcessorAdvice<Map<Strin
     private final boolean skipBindingOnErrorCode;
     private final boolean clientRequestValidation;
     private final boolean enableCORS;
+    private final boolean enableNoContentResponse;
     private final Map<String, String> corsHeaders;
     private final Map<String, String> queryDefaultValues;
     private final boolean requiredBody;
@@ -76,6 +77,7 @@ public class RestBindingAdvice implements CamelInternalProcessorAdvice<Map<Strin
                              DataFormat outJsonDataFormat, DataFormat outXmlDataFormat,
                              String consumes, String produces, String bindingMode,
                              boolean skipBindingOnErrorCode, boolean clientRequestValidation, boolean enableCORS,
+                             boolean enableNoContentResponse,
                              Map<String, String> corsHeaders,
                              Map<String, String> queryDefaultValues,
                              boolean requiredBody, Set<String> requiredQueryParameters,
@@ -131,6 +133,7 @@ public class RestBindingAdvice implements CamelInternalProcessorAdvice<Map<Strin
         this.requiredBody = requiredBody;
         this.requiredQueryParameters = requiredQueryParameters;
         this.requiredHeaders = requiredHeaders;
+        this.enableNoContentResponse = enableNoContentResponse;
     }
 
     @Override
@@ -457,12 +460,38 @@ public class RestBindingAdvice implements CamelInternalProcessorAdvice<Map<Strin
                 if (contentType.contains("json")) {
                     jsonMarshal.process(exchange);
                     setOutputDataType(exchange, new DataType("json"));
+
+                    if (enableNoContentResponse) {
+                        String body = MessageHelper.extractBodyAsString(exchange.getMessage());
+                        if (ObjectHelper.isNotEmpty(body) && (body.equals("[]") || body.equals("{}"))) {
+                            exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, 204);
+                            exchange.getMessage().setBody("");
+                        }
+                    }
                 }
             } else if (isXml && xmlMarshal != null) {
                 // only marshal if its xml content type
                 if (contentType.contains("xml")) {
                     xmlMarshal.process(exchange);
                     setOutputDataType(exchange, new DataType("xml"));
+
+                    if (enableNoContentResponse) {
+                        String body = MessageHelper.extractBodyAsString(exchange.getMessage()).replace("\n", "");
+                        if (ObjectHelper.isNotEmpty(body)) {
+                            int open = 0;
+                            int close = body.indexOf('>');
+                            // xml declaration
+                            if (body.startsWith("<?xml")) {
+                                open = close;
+                                close = body.indexOf('>', close + 1);
+                            }
+                            // empty root element <el/> or <el></el>
+                            if (body.length() == close + 1 || body.length() == (open + 1 + 2 * (close - open) + 1)) {
+                                exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, 204);
+                                exchange.getMessage().setBody("");
+                            }
+                        }
+                    }
                 }
             } else {
                 // we could not bind
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
index 9840cab3459..ccc54d21254 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
@@ -52,6 +52,10 @@ public class RestBindingReifier extends AbstractReifier {
         if (definition.getEnableCORS() != null) {
             cors = parseBoolean(definition.getEnableCORS(), false);
         }
+        boolean noContentResponse = config.isEnableNoContentResponse();
+        if (definition.getEnableNoContentResponse() != null) {
+            noContentResponse = parseBoolean(definition.getEnableNoContentResponse(), false);
+        }
         boolean skip = config.isSkipBindingOnErrorCode();
         if (definition.getSkipBindingOnErrorCode() != null) {
             skip = parseBoolean(definition.getSkipBindingOnErrorCode(), false);
@@ -69,7 +73,7 @@ public class RestBindingReifier extends AbstractReifier {
             return new RestBindingAdvice(
                     camelContext, null, null, null, null,
                     parseString(definition.getConsumes()), parseString(definition.getProduces()), mode, skip, validation, cors,
-                    corsHeaders,
+                    noContentResponse, corsHeaders,
                     definition.getDefaultValues(), definition.getRequiredBody() != null ? definition.getRequiredBody() : false,
                     definition.getRequiredQueryParameters(), definition.getRequiredHeaders());
         }
@@ -141,7 +145,7 @@ public class RestBindingReifier extends AbstractReifier {
         return new RestBindingAdvice(
                 camelContext, json, jaxb, outJson, outJaxb,
                 parseString(definition.getConsumes()), parseString(definition.getProduces()),
-                mode, skip, validation, cors, corsHeaders,
+                mode, skip, validation, cors, noContentResponse, corsHeaders,
                 definition.getDefaultValues(), definition.getRequiredBody() != null ? definition.getRequiredBody() : false,
                 definition.getRequiredQueryParameters(), definition.getRequiredHeaders());
     }
diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/RestConfigurationPropertiesConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/RestConfigurationPropertiesConfigurer.java
index 99cc4a67bc0..6d0cc378e51 100644
--- a/core/camel-main/src/generated/java/org/apache/camel/main/RestConfigurationPropertiesConfigurer.java
+++ b/core/camel-main/src/generated/java/org/apache/camel/main/RestConfigurationPropertiesConfigurer.java
@@ -51,6 +51,8 @@ public class RestConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "DataFormatProperties": target.setDataFormatProperties(property(camelContext, java.util.Map.class, value)); return true;
         case "enablecors":
         case "EnableCORS": target.setEnableCORS(property(camelContext, boolean.class, value)); return true;
+        case "enablenocontentresponse":
+        case "EnableNoContentResponse": target.setEnableNoContentResponse(property(camelContext, boolean.class, value)); return true;
         case "endpointproperties":
         case "EndpointProperties": target.setEndpointProperties(property(camelContext, java.util.Map.class, value)); return true;
         case "host":
@@ -112,6 +114,8 @@ public class RestConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "DataFormatProperties": return java.util.Map.class;
         case "enablecors":
         case "EnableCORS": return boolean.class;
+        case "enablenocontentresponse":
+        case "EnableNoContentResponse": return boolean.class;
         case "endpointproperties":
         case "EndpointProperties": return java.util.Map.class;
         case "host":
@@ -174,6 +178,8 @@ public class RestConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "DataFormatProperties": return target.getDataFormatProperties();
         case "enablecors":
         case "EnableCORS": return target.isEnableCORS();
+        case "enablenocontentresponse":
+        case "EnableNoContentResponse": return target.isEnableNoContentResponse();
         case "endpointproperties":
         case "EndpointProperties": return target.getEndpointProperties();
         case "host":
diff --git a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index de05f6d7933..7c503cfd5be 100644
--- a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -200,6 +200,7 @@
     { "name": "camel.rest.corsHeaders", "description": "Sets the CORS headers to use if CORS has been enabled.", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": "java.util.Map" },
     { "name": "camel.rest.dataFormatProperties", "description": "Sets additional options on data format level", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": "java.util.Map" },
     { "name": "camel.rest.enableCORS", "description": "To specify whether to enable CORS which means Camel will automatic include CORS in the HTTP headers in the response. This option is default false", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
+    { "name": "camel.rest.enableNoContentResponse", "description": "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.rest.endpointProperties", "description": "Sets additional options on endpoint level", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": "java.util.Map" },
     { "name": "camel.rest.host", "description": "Sets the hostname to use by the REST consumer", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "string", "javaType": "java.lang.String" },
     { "name": "camel.rest.hostNameResolver", "description": "Sets the resolver to use for resolving hostname", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": "org.apache.camel.spi.RestHostNameResolver", "defaultValue": "RestHostNameResolver.allLocalIp", "enum": [ "allLocalIp", "localIp", "localHostName" ] },
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index cedb4a2b522..dad7ddf112a 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -208,7 +208,7 @@ The camel.health supports 8 options, which are listed below.
 
 
 === Camel Rest-DSL configurations
-The camel.rest supports 27 options, which are listed below.
+The camel.rest supports 28 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -228,6 +228,7 @@ The camel.rest supports 27 options, which are listed below.
 | *camel.rest.corsHeaders* | Sets the CORS headers to use if CORS has been enabled. |  | Map
 | *camel.rest.dataFormat{zwsp}Properties* | Sets additional options on data format level |  | Map
 | *camel.rest.enableCORS* | To specify whether to enable CORS which means Camel will automatic include CORS in the HTTP headers in the response. This option is default false | false | boolean
+| *camel.rest.enableNoContent{zwsp}Response* | Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false. | false | boolean
 | *camel.rest.endpointProperties* | Sets additional options on endpoint level |  | Map
 | *camel.rest.host* | Sets the hostname to use by the REST consumer |  | String
 | *camel.rest.hostNameResolver* | Sets the resolver to use for resolving hostname | RestHostNameResolver.allLocalIp | RestHostNameResolver
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
index 55d4fead3e9..dc449f96184 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
@@ -1047,6 +1047,7 @@ public class ModelParser extends BaseParser {
                 case "consumes": def.setConsumes(val); break;
                 case "disabled": def.setDisabled(val); break;
                 case "enableCORS": def.setEnableCORS(val); break;
+                case "enableNoContentResponse": def.setEnableNoContentResponse(val); break;
                 case "path": def.setPath(val); break;
                 case "produces": def.setProduces(val); break;
                 case "skipBindingOnErrorCode": def.setSkipBindingOnErrorCode(val); break;
@@ -1077,6 +1078,7 @@ public class ModelParser extends BaseParser {
                 case "component": def.setComponent(val); break;
                 case "consumes": def.setConsumes(val); break;
                 case "enableCORS": def.setEnableCORS(val); break;
+                case "enableNoContentResponse": def.setEnableNoContentResponse(val); break;
                 case "outType": def.setOutType(val); break;
                 case "produces": def.setProduces(val); break;
                 case "skipBindingOnErrorCode": def.setSkipBindingOnErrorCode(val); break;
@@ -1667,6 +1669,7 @@ public class ModelParser extends BaseParser {
                 case "component": def.setComponent(val); break;
                 case "contextPath": def.setContextPath(val); break;
                 case "enableCORS": def.setEnableCORS(val); break;
+                case "enableNoContentResponse": def.setEnableNoContentResponse(val); break;
                 case "host": def.setHost(val); break;
                 case "hostNameResolver": def.setHostNameResolver(RestHostNameResolver.valueOf(val)); break;
                 case "inlineRoutes": def.setInlineRoutes(val); break;
@@ -3066,6 +3069,7 @@ public class ModelParser extends BaseParser {
                 case "deprecated": def.setDeprecated(val); break;
                 case "disabled": def.setDisabled(val); break;
                 case "enableCORS": def.setEnableCORS(val); break;
+                case "enableNoContentResponse": def.setEnableNoContentResponse(val); break;
                 case "outType": def.setOutType(val); break;
                 case "path": def.setPath(val); break;
                 case "produces": def.setProduces(val); break;
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
index 2224f585be1..f21b92a84e7 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
@@ -4352,6 +4352,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("outType", def.getOutType());
         doWriteAttribute("component", def.getComponent());
         doWriteAttribute("bindingMode", def.getBindingMode());
+        doWriteAttribute("enableNoContentResponse", def.getEnableNoContentResponse());
         doWriteAttribute("skipBindingOnErrorCode", def.getSkipBindingOnErrorCode());
         doWriteAttribute("clientRequestValidation", def.getClientRequestValidation());
         doWriteAttribute("produces", def.getProduces());
@@ -4380,6 +4381,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("component", def.getComponent());
         doWriteAttribute("bindingMode", toString(def.getBindingMode()));
         doWriteAttribute("port", def.getPort());
+        doWriteAttribute("enableNoContentResponse", def.getEnableNoContentResponse());
         doWriteAttribute("xmlDataFormat", def.getXmlDataFormat());
         doWriteAttribute("apiVendorExtension", def.getApiVendorExtension());
         doWriteAttribute("apiComponent", def.getApiComponent());
@@ -4402,6 +4404,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("path", def.getPath());
         doWriteAttribute("bindingMode", def.getBindingMode());
         doWriteAttribute("apiDocs", def.getApiDocs());
+        doWriteAttribute("enableNoContentResponse", def.getEnableNoContentResponse());
         doWriteAttribute("skipBindingOnErrorCode", def.getSkipBindingOnErrorCode());
         doWriteAttribute("clientRequestValidation", def.getClientRequestValidation());
         doWriteAttribute("produces", def.getProduces());
@@ -4483,6 +4486,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("routeId", def.getRouteId());
         doWriteAttribute("bindingMode", def.getBindingMode());
         doWriteAttribute("apiDocs", def.getApiDocs());
+        doWriteAttribute("enableNoContentResponse", def.getEnableNoContentResponse());
         doWriteAttribute("skipBindingOnErrorCode", def.getSkipBindingOnErrorCode());
         doWriteAttribute("clientRequestValidation", def.getClientRequestValidation());
         doWriteAttribute("produces", def.getProduces());
diff --git a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
index 665bd65a0b6..60083531f77 100644
--- a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
+++ b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
@@ -4352,6 +4352,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("outType", def.getOutType());
         doWriteAttribute("component", def.getComponent());
         doWriteAttribute("bindingMode", def.getBindingMode());
+        doWriteAttribute("enableNoContentResponse", def.getEnableNoContentResponse());
         doWriteAttribute("skipBindingOnErrorCode", def.getSkipBindingOnErrorCode());
         doWriteAttribute("clientRequestValidation", def.getClientRequestValidation());
         doWriteAttribute("produces", def.getProduces());
@@ -4380,6 +4381,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("component", def.getComponent());
         doWriteAttribute("bindingMode", toString(def.getBindingMode()));
         doWriteAttribute("port", def.getPort());
+        doWriteAttribute("enableNoContentResponse", def.getEnableNoContentResponse());
         doWriteAttribute("xmlDataFormat", def.getXmlDataFormat());
         doWriteAttribute("apiVendorExtension", def.getApiVendorExtension());
         doWriteAttribute("apiComponent", def.getApiComponent());
@@ -4402,6 +4404,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("path", def.getPath());
         doWriteAttribute("bindingMode", def.getBindingMode());
         doWriteAttribute("apiDocs", def.getApiDocs());
+        doWriteAttribute("enableNoContentResponse", def.getEnableNoContentResponse());
         doWriteAttribute("skipBindingOnErrorCode", def.getSkipBindingOnErrorCode());
         doWriteAttribute("clientRequestValidation", def.getClientRequestValidation());
         doWriteAttribute("produces", def.getProduces());
@@ -4483,6 +4486,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("routeId", def.getRouteId());
         doWriteAttribute("bindingMode", def.getBindingMode());
         doWriteAttribute("apiDocs", def.getApiDocs());
+        doWriteAttribute("enableNoContentResponse", def.getEnableNoContentResponse());
         doWriteAttribute("skipBindingOnErrorCode", def.getSkipBindingOnErrorCode());
         doWriteAttribute("clientRequestValidation", def.getClientRequestValidation());
         doWriteAttribute("produces", def.getProduces());
diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_1.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_1.adoc
index 7ec4b675246..91967bab9bc 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_1.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_1.adoc
@@ -243,3 +243,7 @@ span.setTag(TagConstants.URL_SCHEME, scheme);
 
 The default value for `sessionTimeoutMs` has been updated to  `45000` ms, while the default value for `consumerRequestTimeoutMs` has been updated to `30000`. More information in CAMEL-19921 issue.
 
+=== camel-core, rest
+
+A new rest configuration option, `enableNoContentResponse`,
+allows HTTP 204 to be returned with an empty body if a Message contains an empty JSON object or empty XML root object when set to `true`.
diff --git a/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc b/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc
index ec817fb3dab..a32e1ec28a0 100644
--- a/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc
+++ b/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc
@@ -507,6 +507,7 @@ The Rest DSL supports the following options:
 | *corsHeaders* | Sets the CORS headers to use if CORS has been enabled. |  | Map
 | *dataFormatProperties* | Sets additional options on data format level |  | Map
 | *enableCORS* | To specify whether to enable CORS which means Camel will automatic include CORS in the HTTP headers in the response. This option is default false | false | boolean
+| *enableNoContentResponse* | To specify whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. | false | boolean
 | *endpointProperties* | Sets additional options on endpoint level |  | Map
 | *host* | Sets the hostname to use by the REST consumer |  | String
 | *hostNameResolver* | Sets the resolver to use for resolving hostname | RestHostNameResolver.allLocalIp | RestHostNameResolver
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 98270b33ddc..37b8eb620cc 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -4550,6 +4550,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "description", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "disabled", type = "boolean", description = "Whether to disable this REST service from the route during build time. Once an REST service has been disabled then it cannot be enabled later at runtime.", displayName = "Disabled"),
                     @YamlProperty(name = "enable-cors", type = "boolean"),
+                    @YamlProperty(name = "enable-no-content-response", type = "boolean", description = "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", displayName = "Enable No Content Response"),
                     @YamlProperty(name = "id", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "out-type", type = "string", description = "Sets the class name to use for binding from POJO to output for the outgoing data This option will override what may be configured on a parent level The name of the class of the input data. Append a to the end of the name if you want the input to be an array type.", displayName = "Out Type"),
                     @YamlProperty(name = "param", type = "array:org.apache.camel.model.rest.ParamDefinition"),
@@ -4612,6 +4613,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setEnableCORS(val);
                     break;
                 }
+                case "enable-no-content-response": {
+                    String val = asText(node);
+                    target.setEnableNoContentResponse(val);
+                    break;
+                }
                 case "out-type": {
                     String val = asText(node);
                     target.setOutType(val);
@@ -5933,6 +5939,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "description", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "disabled", type = "boolean", description = "Whether to disable this REST service from the route during build time. Once an REST service has been disabled then it cannot be enabled later at runtime.", displayName = "Disabled"),
                     @YamlProperty(name = "enable-cors", type = "boolean"),
+                    @YamlProperty(name = "enable-no-content-response", type = "boolean", description = "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", displayName = "Enable No Content Response"),
                     @YamlProperty(name = "id", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "out-type", type = "string", description = "Sets the class name to use for binding from POJO to output for the outgoing data This option will override what may be configured on a parent level The name of the class of the input data. Append a to the end of the name if you want the input to be an array type.", displayName = "Out Type"),
                     @YamlProperty(name = "param", type = "array:org.apache.camel.model.rest.ParamDefinition"),
@@ -5995,6 +6002,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setEnableCORS(val);
                     break;
                 }
+                case "enable-no-content-response": {
+                    String val = asText(node);
+                    target.setEnableNoContentResponse(val);
+                    break;
+                }
                 case "out-type": {
                     String val = asText(node);
                     target.setOutType(val);
@@ -6381,6 +6393,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "description", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "disabled", type = "boolean", description = "Whether to disable this REST service from the route during build time. Once an REST service has been disabled then it cannot be enabled later at runtime.", displayName = "Disabled"),
                     @YamlProperty(name = "enable-cors", type = "boolean"),
+                    @YamlProperty(name = "enable-no-content-response", type = "boolean", description = "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", displayName = "Enable No Content Response"),
                     @YamlProperty(name = "id", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "out-type", type = "string", description = "Sets the class name to use for binding from POJO to output for the outgoing data This option will override what may be configured on a parent level The name of the class of the input data. Append a to the end of the name if you want the input to be an array type.", displayName = "Out Type"),
                     @YamlProperty(name = "param", type = "array:org.apache.camel.model.rest.ParamDefinition"),
@@ -6443,6 +6456,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setEnableCORS(val);
                     break;
                 }
+                case "enable-no-content-response": {
+                    String val = asText(node);
+                    target.setEnableNoContentResponse(val);
+                    break;
+                }
                 case "out-type": {
                     String val = asText(node);
                     target.setOutType(val);
@@ -10672,6 +10690,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "description", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "disabled", type = "boolean", description = "Whether to disable this REST service from the route during build time. Once an REST service has been disabled then it cannot be enabled later at runtime.", displayName = "Disabled"),
                     @YamlProperty(name = "enable-cors", type = "boolean"),
+                    @YamlProperty(name = "enable-no-content-response", type = "boolean", description = "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", displayName = "Enable No Content Response"),
                     @YamlProperty(name = "id", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "out-type", type = "string", description = "Sets the class name to use for binding from POJO to output for the outgoing data This option will override what may be configured on a parent level The name of the class of the input data. Append a to the end of the name if you want the input to be an array type.", displayName = "Out Type"),
                     @YamlProperty(name = "param", type = "array:org.apache.camel.model.rest.ParamDefinition"),
@@ -10734,6 +10753,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setEnableCORS(val);
                     break;
                 }
+                case "enable-no-content-response": {
+                    String val = asText(node);
+                    target.setEnableNoContentResponse(val);
+                    break;
+                }
                 case "out-type": {
                     String val = asText(node);
                     target.setOutType(val);
@@ -11131,6 +11155,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "description", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "disabled", type = "boolean", description = "Whether to disable this REST service from the route during build time. Once an REST service has been disabled then it cannot be enabled later at runtime.", displayName = "Disabled"),
                     @YamlProperty(name = "enable-cors", type = "boolean"),
+                    @YamlProperty(name = "enable-no-content-response", type = "boolean", description = "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", displayName = "Enable No Content Response"),
                     @YamlProperty(name = "id", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "out-type", type = "string", description = "Sets the class name to use for binding from POJO to output for the outgoing data This option will override what may be configured on a parent level The name of the class of the input data. Append a to the end of the name if you want the input to be an array type.", displayName = "Out Type"),
                     @YamlProperty(name = "param", type = "array:org.apache.camel.model.rest.ParamDefinition"),
@@ -11193,6 +11218,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setEnableCORS(val);
                     break;
                 }
+                case "enable-no-content-response": {
+                    String val = asText(node);
+                    target.setEnableNoContentResponse(val);
+                    break;
+                }
                 case "out-type": {
                     String val = asText(node);
                     target.setOutType(val);
@@ -11639,6 +11669,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "description", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "disabled", type = "boolean", description = "Whether to disable this REST service from the route during build time. Once an REST service has been disabled then it cannot be enabled later at runtime.", displayName = "Disabled"),
                     @YamlProperty(name = "enable-cors", type = "boolean"),
+                    @YamlProperty(name = "enable-no-content-response", type = "boolean", description = "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", displayName = "Enable No Content Response"),
                     @YamlProperty(name = "id", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "out-type", type = "string", description = "Sets the class name to use for binding from POJO to output for the outgoing data This option will override what may be configured on a parent level The name of the class of the input data. Append a to the end of the name if you want the input to be an array type.", displayName = "Out Type"),
                     @YamlProperty(name = "param", type = "array:org.apache.camel.model.rest.ParamDefinition"),
@@ -11701,6 +11732,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setEnableCORS(val);
                     break;
                 }
+                case "enable-no-content-response": {
+                    String val = asText(node);
+                    target.setEnableNoContentResponse(val);
+                    break;
+                }
                 case "out-type": {
                     String val = asText(node);
                     target.setOutType(val);
@@ -13153,6 +13189,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "consumes", type = "string", description = "To define the content type what the REST service consumes (accept as input), such as application/xml or application/json", displayName = "Consumes"),
                     @YamlProperty(name = "description", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "enable-cors", type = "boolean"),
+                    @YamlProperty(name = "enable-no-content-response", type = "boolean", description = "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", displayName = "Enable No Content Response"),
                     @YamlProperty(name = "id", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "out-type", type = "string", description = "Sets the class name to use for binding from POJO to output for the outgoing data The name of the class of the input data. Append a to the end of the name if you want the input to be an array type.", displayName = "Out Type"),
                     @YamlProperty(name = "produces", type = "string", description = "To define the content type what the REST service produces (uses for output), such as application/xml or application/json", displayName = "Produces"),
@@ -13199,6 +13236,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setEnableCORS(val);
                     break;
                 }
+                case "enable-no-content-response": {
+                    String val = asText(node);
+                    target.setEnableNoContentResponse(val);
+                    break;
+                }
                 case "out-type": {
                     String val = asText(node);
                     target.setOutType(val);
@@ -13264,6 +13306,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "cors-headers", type = "array:org.apache.camel.model.rest.RestPropertyDefinition", description = "Allows to configure custom CORS headers.", displayName = "Cors Headers"),
                     @YamlProperty(name = "data-format-property", type = "array:org.apache.camel.model.rest.RestPropertyDefinition", description = "Allows to configure as many additional properties for the data formats in use. For example set property prettyPrint to true to have json outputted in pretty mode. The properties can be prefixed to denote the option is only for either JSON or XML and for either the IN or the OUT. The prefixes are: json.in. json.out. xml.in. xml.out. For example [...]
                     @YamlProperty(name = "enable-cors", type = "boolean"),
+                    @YamlProperty(name = "enable-no-content-response", type = "boolean", description = "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", displayName = "Enable No Content Response"),
                     @YamlProperty(name = "endpoint-property", type = "array:org.apache.camel.model.rest.RestPropertyDefinition", description = "Allows to configure as many additional properties for the rest endpoint in use.", displayName = "Endpoint Property"),
                     @YamlProperty(name = "host", type = "string", description = "The hostname to use for exposing the REST service.", displayName = "Host"),
                     @YamlProperty(name = "host-name-resolver", type = "enum:allLocalIp,localHostName,localIp", defaultValue = "allLocalIp", description = "If no hostname has been explicit configured, then this resolver is used to compute the hostname the REST service will be using.", displayName = "Host Name Resolver"),
@@ -13366,6 +13409,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setEnableCORS(val);
                     break;
                 }
+                case "enable-no-content-response": {
+                    String val = asText(node);
+                    target.setEnableNoContentResponse(val);
+                    break;
+                }
                 case "endpoint-property": {
                     java.util.List<org.apache.camel.model.rest.RestPropertyDefinition> val = asFlatList(node, org.apache.camel.model.rest.RestPropertyDefinition.class);
                     target.setEndpointProperties(val);
@@ -13495,6 +13543,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "description", type = "string", description = "Sets the id of this node", displayName = "Id"),
                     @YamlProperty(name = "disabled", type = "boolean", description = "Whether to disable this REST service from the route during build time. Once an REST service has been disabled then it cannot be enabled later at runtime.", displayName = "Disabled"),
                     @YamlProperty(name = "enable-cors", type = "boolean"),
+                    @YamlProperty(name = "enable-no-content-response", type = "boolean", description = "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false.", displayName = "Enable No Content Response"),
                     @YamlProperty(name = "get", type = "array:org.apache.camel.model.rest.GetDefinition"),
                     @YamlProperty(name = "head", type = "array:org.apache.camel.model.rest.HeadDefinition"),
                     @YamlProperty(name = "id", type = "string", description = "Sets the id of this node", displayName = "Id"),
@@ -13553,6 +13602,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setEnableCORS(val);
                     break;
                 }
+                case "enable-no-content-response": {
+                    String val = asText(node);
+                    target.setEnableNoContentResponse(val);
+                    break;
+                }
                 case "path": {
                     String val = asText(node);
                     target.setPath(val);
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
index c0d7232ddcb..3fd4b751151 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
@@ -13669,6 +13669,11 @@
           "enableCors" : {
             "type" : "boolean"
           },
+          "enableNoContentResponse" : {
+            "type" : "boolean",
+            "title" : "Enable No Content Response",
+            "description" : "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false."
+          },
           "id" : {
             "type" : "string",
             "title" : "Id",
@@ -13775,6 +13780,11 @@
           "enableCors" : {
             "type" : "boolean"
           },
+          "enableNoContentResponse" : {
+            "type" : "boolean",
+            "title" : "Enable No Content Response",
+            "description" : "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false."
+          },
           "id" : {
             "type" : "string",
             "title" : "Id",
@@ -13881,6 +13891,11 @@
           "enableCors" : {
             "type" : "boolean"
           },
+          "enableNoContentResponse" : {
+            "type" : "boolean",
+            "title" : "Enable No Content Response",
+            "description" : "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false."
+          },
           "id" : {
             "type" : "string",
             "title" : "Id",
@@ -14154,6 +14169,11 @@
           "enableCors" : {
             "type" : "boolean"
           },
+          "enableNoContentResponse" : {
+            "type" : "boolean",
+            "title" : "Enable No Content Response",
+            "description" : "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false."
+          },
           "id" : {
             "type" : "string",
             "title" : "Id",
@@ -14260,6 +14280,11 @@
           "enableCors" : {
             "type" : "boolean"
           },
+          "enableNoContentResponse" : {
+            "type" : "boolean",
+            "title" : "Enable No Content Response",
+            "description" : "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false."
+          },
           "id" : {
             "type" : "string",
             "title" : "Id",
@@ -14366,6 +14391,11 @@
           "enableCors" : {
             "type" : "boolean"
           },
+          "enableNoContentResponse" : {
+            "type" : "boolean",
+            "title" : "Enable No Content Response",
+            "description" : "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false."
+          },
           "id" : {
             "type" : "string",
             "title" : "Id",
@@ -14559,6 +14589,11 @@
           "enableCors" : {
             "type" : "boolean"
           },
+          "enableNoContentResponse" : {
+            "type" : "boolean",
+            "title" : "Enable No Content Response",
+            "description" : "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false."
+          },
           "id" : {
             "type" : "string",
             "title" : "Id",
@@ -14684,6 +14719,11 @@
           "enableCors" : {
             "type" : "boolean"
           },
+          "enableNoContentResponse" : {
+            "type" : "boolean",
+            "title" : "Enable No Content Response",
+            "description" : "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false."
+          },
           "endpointProperty" : {
             "type" : "array",
             "title" : "Endpoint Property",
@@ -14799,6 +14839,11 @@
           "enableCors" : {
             "type" : "boolean"
           },
+          "enableNoContentResponse" : {
+            "type" : "boolean",
+            "title" : "Enable No Content Response",
+            "description" : "Whether to return HTTP 204 with an empty body when a response contains an empty JSON object or XML root object. The default value is false."
+          },
           "get" : {
             "type" : "array",
             "items" : {