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/08/23 07:36:23 UTC

[camel] 05/06: CAMEL-19772: camel-core - Dump routes to include custom beans

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

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

commit bb616fbc2db4a40158aed376ecbb0a3ced5fafc5
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Aug 23 09:23:59 2023 +0200

    CAMEL-19772: camel-core - Dump routes to include custom beans
---
 .../main/camel-main-configuration-metadata.json    |  1 +
 .../spring/DumpModelAsXmlPlaceholdersTest.java     |  4 +--
 .../SpringJmxDumpCBRRoutesAsXmlTest.java           |  6 ++--
 .../routebuilder/SpringRouteTemplateTest.java      |  4 +--
 .../org/apache/camel/spi/DumpRoutesStrategy.java   |  7 +++++
 .../org/apache/camel/spi/ModelToXMLDumper.java     |  3 +-
 .../org/apache/camel/spi/ModelToYAMLDumper.java    |  3 +-
 .../impl/DefaultDumpRoutesStrategyConfigurer.java  |  6 ++++
 .../camel/impl/DefaultDumpRoutesStrategy.java      | 15 ++++++---
 .../util/DumpModelAsXmlFromRouteTemplateTest.java  |  5 +--
 .../camel/util/DumpModelAsXmlPlaceholdersTest.java |  4 +--
 .../util/DumpModelAsXmlSplitBodyRouteTest.java     |  1 -
 .../DumpModelAsXmlTransformRouteConstantTest.java  |  1 -
 .../DumpModelAsXmlTransformRouteLanguageTest.java  |  1 -
 .../util/DumpModelAsXmlTransformRouteTest.java     |  1 -
 .../util/DumpModelAsYamlUriAsParametersTest.java   | 17 +++++++++-
 .../camel/util/uri-as-parameters-no-ids.yaml       | 36 ++++++++++++++++++++++
 .../MainConfigurationPropertiesConfigurer.java     |  6 ++++
 .../camel-main-configuration-metadata.json         |  1 +
 core/camel-main/src/main/docs/main.adoc            |  3 +-
 .../camel/main/DefaultConfigurationConfigurer.java |  1 +
 .../camel/main/DefaultConfigurationProperties.java | 20 ++++++++++++
 .../management/mbean/ManagedCamelContextMBean.java |  6 ++++
 .../api/management/mbean/ManagedRouteMBean.java    |  6 ++++
 .../management/mbean/ManagedCamelContext.java      | 23 ++++++++++----
 .../camel/management/mbean/ManagedRoute.java       | 16 ++++++++--
 .../org/apache/camel/xml/LwModelToXMLDumper.java   | 13 ++++----
 .../camel/xml/jaxb/JaxbModelToXMLDumper.java       | 25 ++++++++++-----
 .../org/apache/camel/yaml/LwModelToYAMLDumper.java | 13 ++++----
 29 files changed, 194 insertions(+), 54 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 6dd2a3c22de..e8028acc780 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
@@ -40,6 +40,7 @@
     { "name": "camel.main.devConsoleEnabled", "description": "Whether to enable developer console (requires camel-console on classpath). The developer console is only for assisting during development. This is NOT for production usage.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.dumpRoutes", "description": "If dumping is enabled then Camel will during startup dump all loaded routes (incl rests and route templates) represented as XML\/YAML DSL into the log. This is intended for trouble shooting or to assist during development. Sensitive information that may be configured in the route endpoints could potentially be included in the dump output and is therefore not recommended being used for production usage. This requires to have camel-xml [...]
     { "name": "camel.main.dumpRoutesDirectory", "description": "Whether to save route dumps to files in the given directory. The name of the files are based on original loaded resource, or an autogenerated name.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.main.dumpRoutesGeneratedIds", "description": "Whether to include auto generated IDs in the dumped output. Default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.dumpRoutesInclude", "description": "Controls what to include in output for route dumping. Possible values: all, routes, rests, routeConfigurations, routeTemplates, beans. Multiple values can be separated by comma. Default is routes.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "routes" },
     { "name": "camel.main.dumpRoutesLog", "description": "Whether to log route dumps to Logger", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.main.dumpRoutesResolvePlaceholders", "description": "Whether to resolve property placeholders in the dumped output. Default is true.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
diff --git a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/DumpModelAsXmlPlaceholdersTest.java b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/DumpModelAsXmlPlaceholdersTest.java
index 2d8aad7d51b..6628f967ad9 100644
--- a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/DumpModelAsXmlPlaceholdersTest.java
+++ b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/DumpModelAsXmlPlaceholdersTest.java
@@ -42,9 +42,9 @@ public class DumpModelAsXmlPlaceholdersTest extends SpringTestSupport {
         assertNotNull(xml);
         log.info(xml);
 
-        assertTrue(xml.contains("<route xmlns=\"http://camel.apache.org/schema/spring\" customId=\"true\" id=\"Gouda\">"));
+        assertTrue(xml.contains("<route xmlns=\"http://camel.apache.org/schema/spring\" id=\"Gouda\">"));
         assertTrue(xml.contains("<from uri=\"direct:start-{{cheese.type}}\"/>"));
-        assertTrue(xml.contains("<to customId=\"true\" id=\"log\" uri=\"direct:end-{{cheese.type}}\"/>"));
+        assertTrue(xml.contains("<to id=\"log\" uri=\"direct:end-{{cheese.type}}\"/>"));
     }
 
 }
diff --git a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/management/SpringJmxDumpCBRRoutesAsXmlTest.java b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/management/SpringJmxDumpCBRRoutesAsXmlTest.java
index 729e9a4c0a2..34849caf703 100644
--- a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/management/SpringJmxDumpCBRRoutesAsXmlTest.java
+++ b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/management/SpringJmxDumpCBRRoutesAsXmlTest.java
@@ -58,10 +58,8 @@ public class SpringJmxDumpCBRRoutesAsXmlTest extends SpringTestSupport {
         assertTrue(xml.contains("myRoute"), xml);
         assertTrue(xml.matches("[\\S\\s]*<when id=\"when[0-9]+\">[\\S\\s]*"));
         assertTrue(xml.matches("[\\S\\s]*<otherwise id=\"otherwise[0-9]+\">[\\S\\s]*"));
-        assertTrue(xml.contains("<route customId=\"true\" id=\"myRoute\">")
-                || xml.contains("<route id=\"myRoute\" customId=\"true\">"));
-        assertTrue(xml.contains("<choice customId=\"true\" id=\"myChoice\">")
-                || xml.contains("<choice id=\"myChoice\" customId=\"true\">"));
+        assertTrue(xml.contains("<route id=\"myRoute\">"));
+        assertTrue(xml.contains("<choice id=\"myChoice\">"));
     }
 
 }
diff --git a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/routebuilder/SpringRouteTemplateTest.java b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/routebuilder/SpringRouteTemplateTest.java
index 3a678a7cfff..44101e84a1a 100644
--- a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/routebuilder/SpringRouteTemplateTest.java
+++ b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/routebuilder/SpringRouteTemplateTest.java
@@ -155,7 +155,7 @@ public class SpringRouteTemplateTest extends SpringTestSupport {
 
         RouteDefinition def = context.getRouteDefinition("first");
 
-        String xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, true);
+        String xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, true, false);
 
         assertNotNull(xml);
         Assertions.assertTrue(xml.contains("<from uri=\"direct:one\"/>"));
@@ -171,7 +171,7 @@ public class SpringRouteTemplateTest extends SpringTestSupport {
         RoutesDefinition def = new RoutesDefinition();
         def.setRoutes(context.getRouteDefinitions());
 
-        String xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, true);
+        String xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, true, false);
 
         assertNotNull(xml);
         Assertions.assertTrue(xml.contains("<from uri=\"direct:one\"/>"));
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/DumpRoutesStrategy.java b/core/camel-api/src/main/java/org/apache/camel/spi/DumpRoutesStrategy.java
index 54ad32226d5..6372591b996 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/DumpRoutesStrategy.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/DumpRoutesStrategy.java
@@ -60,6 +60,13 @@ public interface DumpRoutesStrategy extends StaticService {
      */
     void setUriAsParameters(boolean uriAsParameters);
 
+    boolean isGeneratedIds();
+
+    /**
+     * Whether to include auto generated IDs in the dumped output. Default is false.
+     */
+    void setGeneratedIds(boolean generatedIds);
+
     boolean isLog();
 
     /**
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/ModelToXMLDumper.java b/core/camel-api/src/main/java/org/apache/camel/spi/ModelToXMLDumper.java
index 94f5ec8a764..47ee821349a 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ModelToXMLDumper.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ModelToXMLDumper.java
@@ -47,11 +47,12 @@ public interface ModelToXMLDumper {
      * @param  context             the CamelContext
      * @param  definition          the definition, such as a {@link org.apache.camel.NamedNode}
      * @param  resolvePlaceholders whether to resolve property placeholders in the dumped XML
+     * @param  generatedIds        whether to include auto generated IDs
      * @return                     the output in XML (is formatted)
      * @throws Exception           is throw if error marshalling to XML
      */
     String dumpModelAsXml(
-            CamelContext context, NamedNode definition, boolean resolvePlaceholders)
+            CamelContext context, NamedNode definition, boolean resolvePlaceholders, boolean generatedIds)
             throws Exception;
 
     /**
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/ModelToYAMLDumper.java b/core/camel-api/src/main/java/org/apache/camel/spi/ModelToYAMLDumper.java
index 6f4ae0f1423..e4139b1a089 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ModelToYAMLDumper.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ModelToYAMLDumper.java
@@ -48,12 +48,13 @@ public interface ModelToYAMLDumper {
      * @param  definition          the definition, such as a {@link NamedNode}
      * @param  resolvePlaceholders whether to resolve property placeholders in the dumped YAML
      * @param  uriAsParameters     whether to expand uri into a key/value parameters
+     * @param  generatedIds        whether to include auto generated IDs
      * @return                     the output in YAML (is formatted)
      * @throws Exception           is throw if error marshalling to YAML
      */
     String dumpModelAsYaml(
             CamelContext context, NamedNode definition,
-            boolean resolvePlaceholders, boolean uriAsParameters)
+            boolean resolvePlaceholders, boolean uriAsParameters, boolean generatedIds)
             throws Exception;
 
     /**
diff --git a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/DefaultDumpRoutesStrategyConfigurer.java b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/DefaultDumpRoutesStrategyConfigurer.java
index 69ed6aad744..fabccd51adb 100644
--- a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/DefaultDumpRoutesStrategyConfigurer.java
+++ b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/DefaultDumpRoutesStrategyConfigurer.java
@@ -25,6 +25,8 @@ public class DefaultDumpRoutesStrategyConfigurer extends org.apache.camel.suppor
         case "CamelContext": target.setCamelContext(property(camelContext, org.apache.camel.CamelContext.class, value)); return true;
         case "directory":
         case "Directory": target.setDirectory(property(camelContext, java.lang.String.class, value)); return true;
+        case "generatedids":
+        case "GeneratedIds": target.setGeneratedIds(property(camelContext, boolean.class, value)); return true;
         case "include":
         case "Include": target.setInclude(property(camelContext, java.lang.String.class, value)); return true;
         case "log":
@@ -44,6 +46,8 @@ public class DefaultDumpRoutesStrategyConfigurer extends org.apache.camel.suppor
         case "CamelContext": return org.apache.camel.CamelContext.class;
         case "directory":
         case "Directory": return java.lang.String.class;
+        case "generatedids":
+        case "GeneratedIds": return boolean.class;
         case "include":
         case "Include": return java.lang.String.class;
         case "log":
@@ -64,6 +68,8 @@ public class DefaultDumpRoutesStrategyConfigurer extends org.apache.camel.suppor
         case "CamelContext": return target.getCamelContext();
         case "directory":
         case "Directory": return target.getDirectory();
+        case "generatedids":
+        case "GeneratedIds": return target.isGeneratedIds();
         case "include":
         case "Include": return target.getInclude();
         case "log":
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultDumpRoutesStrategy.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultDumpRoutesStrategy.java
index 0edff3b4690..cf0e4093d3f 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultDumpRoutesStrategy.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultDumpRoutesStrategy.java
@@ -63,8 +63,6 @@ import static org.apache.camel.support.LoggerHelper.stripSourceLocationLineNumbe
 @ServiceFactory("default-" + DumpRoutesStrategy.FACTORY)
 public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRoutesStrategy, CamelContextAware {
 
-    // yaml dump (remove auto-generated id - option to turn on|off)
-
     private static final Logger LOG = LoggerFactory.getLogger(DefaultDumpRoutesStrategy.class);
     private static final String DIVIDER = "--------------------------------------------------------------------------------";
 
@@ -74,6 +72,7 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
     private String include = "routes";
     private boolean resolvePlaceholders = true;
     private boolean uriAsParameters;
+    private boolean generatedIds = true;
     private boolean log = true;
     private String directory;
 
@@ -103,6 +102,14 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
         this.resolvePlaceholders = resolvePlaceholders;
     }
 
+    public boolean isGeneratedIds() {
+        return generatedIds;
+    }
+
+    public void setGeneratedIds(boolean generatedIds) {
+        this.generatedIds = generatedIds;
+    }
+
     public boolean isLog() {
         return log;
     }
@@ -297,7 +304,7 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
             CamelContext camelContext, NamedNode def, Resource resource,
             ModelToYAMLDumper dumper, String kind, StringBuilder sbLocal, StringBuilder sbLog) {
         try {
-            String dump = dumper.dumpModelAsYaml(camelContext, def, resolvePlaceholders, uriAsParameters);
+            String dump = dumper.dumpModelAsYaml(camelContext, def, resolvePlaceholders, uriAsParameters, generatedIds);
             sbLocal.append(dump);
             appendLogDump(resource, dump, sbLog);
         } catch (Exception e) {
@@ -496,7 +503,7 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
             CamelContext camelContext, NamedNode def, Resource resource,
             ModelToXMLDumper dumper, String replace, String kind, StringBuilder sbLocal, StringBuilder sbLog) {
         try {
-            String xml = dumper.dumpModelAsXml(camelContext, def, resolvePlaceholders);
+            String xml = dumper.dumpModelAsXml(camelContext, def, resolvePlaceholders, generatedIds);
             // remove spring schema xmlns that camel-jaxb dumper includes
             xml = StringHelper.replaceFirst(xml, " xmlns=\"http://camel.apache.org/schema/spring\">", ">");
             xml = xml.replace("</" + replace + ">", "</" + replace + ">\n");
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlFromRouteTemplateTest.java b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlFromRouteTemplateTest.java
index 8174cee9e8e..50e50f4f30c 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlFromRouteTemplateTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlFromRouteTemplateTest.java
@@ -81,7 +81,8 @@ public class DumpModelAsXmlFromRouteTemplateTest extends ContextTestSupport {
         map.put("whereto", "Jacks");
         context.addRouteFromTemplate("bar2", "myTemplate", map);
 
-        String xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, context.getRouteDefinition("bar"), true);
+        String xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, context.getRouteDefinition("bar"), true,
+                true);
         assertNotNull(xml);
         log.info(xml);
 
@@ -103,7 +104,7 @@ public class DumpModelAsXmlFromRouteTemplateTest extends ContextTestSupport {
         node = (Element) nodes.item(0);
         assertEquals("bar", node.getAttribute("id"));
 
-        xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, context.getRouteDefinition("bar2"), true);
+        xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, context.getRouteDefinition("bar2"), true, true);
         assertNotNull(xml);
         log.info(xml);
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlPlaceholdersTest.java b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlPlaceholdersTest.java
index f2d9e6deb3c..edd18a473d1 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlPlaceholdersTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlPlaceholdersTest.java
@@ -32,9 +32,9 @@ public class DumpModelAsXmlPlaceholdersTest extends ContextTestSupport {
         String xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, context.getRouteDefinition("Gouda"));
         assertNotNull(xml);
         log.info(xml);
-        assertTrue(xml.contains("<route xmlns=\"http://camel.apache.org/schema/spring\" customId=\"true\" id=\"Gouda\">"));
+        assertTrue(xml.contains("<route xmlns=\"http://camel.apache.org/schema/spring\" id=\"Gouda\">"));
         assertTrue(xml.contains("<from uri=\"direct:start-{{cheese.type}}\"/>"));
-        assertTrue(xml.contains("<to customId=\"true\" id=\"log\" uri=\"direct:end-{{cheese.type}}\"/>"));
+        assertTrue(xml.contains("<to id=\"log\" uri=\"direct:end-{{cheese.type}}\"/>"));
     }
 
     @Override
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlSplitBodyRouteTest.java b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlSplitBodyRouteTest.java
index dec9c19d241..67526fa62ce 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlSplitBodyRouteTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlSplitBodyRouteTest.java
@@ -56,7 +56,6 @@ public class DumpModelAsXmlSplitBodyRouteTest extends ContextTestSupport {
         assertNotNull(node, "Node <to> expected to be instanceof Element");
         assertEquals("mock:sub", node.getAttribute("uri"));
         assertEquals("myMock", node.getAttribute("id"));
-        assertEquals("true", node.getAttribute("customId"));
     }
 
     @Override
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteConstantTest.java b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteConstantTest.java
index fb04e447e95..00fb2802fd0 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteConstantTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteConstantTest.java
@@ -53,7 +53,6 @@ public class DumpModelAsXmlTransformRouteConstantTest extends ContextTestSupport
         assertNotNull(node, "Node <to> expected to be instanceof Element");
         assertEquals("mock:result", node.getAttribute("uri"));
         assertEquals("myMock", node.getAttribute("id"));
-        assertEquals("true", node.getAttribute("customId"));
     }
 
     @Override
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteLanguageTest.java
index 5c30a125b6a..1bc10f2da7a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteLanguageTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteLanguageTest.java
@@ -55,7 +55,6 @@ public class DumpModelAsXmlTransformRouteLanguageTest extends ContextTestSupport
         assertNotNull(node, "Node <to> expected to be instanceof Element");
         assertEquals("mock:result", node.getAttribute("uri"));
         assertEquals("myMock", node.getAttribute("id"));
-        assertEquals("true", node.getAttribute("customId"));
     }
 
     @Override
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteTest.java b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteTest.java
index 3e3b17cb8df..feb44e8cc41 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteTest.java
@@ -53,7 +53,6 @@ public class DumpModelAsXmlTransformRouteTest extends ContextTestSupport {
         assertNotNull(node, "Node <to> expected to be instanceof Element");
         assertEquals("mock:result", node.getAttribute("uri"));
         assertEquals("myMock", node.getAttribute("id"));
-        assertEquals("true", node.getAttribute("customId"));
     }
 
     @Override
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsYamlUriAsParametersTest.java b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsYamlUriAsParametersTest.java
index 3268951e050..46770e1de9a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsYamlUriAsParametersTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsYamlUriAsParametersTest.java
@@ -30,7 +30,7 @@ public class DumpModelAsYamlUriAsParametersTest extends DumpModelAsYamlTestSuppo
     @Test
     public void testDumpModelAsYaml() throws Exception {
         String out = PluginHelper.getModelToYAMLDumper(context).dumpModelAsYaml(context, context.getRouteDefinition("myRoute"),
-                true, true);
+                true, true, true);
         assertNotNull(out);
         log.info(out);
 
@@ -40,6 +40,21 @@ public class DumpModelAsYamlUriAsParametersTest extends DumpModelAsYamlTestSuppo
         Assertions.assertEquals(expected, out);
     }
 
+    @Test
+    public void testDumpModelAsYamlGeneratedIds() throws Exception {
+        String out = PluginHelper.getModelToYAMLDumper(context).dumpModelAsYaml(context, context.getRouteDefinition("myRoute"),
+                true, true, false);
+        assertNotNull(out);
+        log.info(out);
+
+        String expected
+                = IOHelper.stripLineComments(
+                        Paths.get("src/test/resources/org/apache/camel/util/uri-as-parameters-no-ids.yaml"),
+                        "#",
+                        true);
+        Assertions.assertEquals(expected, out);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
diff --git a/core/camel-core/src/test/resources/org/apache/camel/util/uri-as-parameters-no-ids.yaml b/core/camel-core/src/test/resources/org/apache/camel/util/uri-as-parameters-no-ids.yaml
new file mode 100644
index 00000000000..f9da0fca7f7
--- /dev/null
+++ b/core/camel-core/src/test/resources/org/apache/camel/util/uri-as-parameters-no-ids.yaml
@@ -0,0 +1,36 @@
+#
+# 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.
+#
+
+- route:
+    id: myRoute
+    from:
+      uri: seda
+      parameters:
+        name: foo
+        size: 1234
+        multipleConsumers: true
+      steps:
+        - transform:
+            simple:
+              expression: "Hello ${body}"
+        - to:
+            id: myMock
+            uri: mock
+            parameters:
+              name: result
+              retainFirst: 5
+              failFast: true
diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
index 288a99df147..0bc0b781c4e 100644
--- a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
+++ b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
@@ -75,6 +75,8 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "DumpRoutes": target.setDumpRoutes(property(camelContext, java.lang.String.class, value)); return true;
         case "dumproutesdirectory":
         case "DumpRoutesDirectory": target.setDumpRoutesDirectory(property(camelContext, java.lang.String.class, value)); return true;
+        case "dumproutesgeneratedids":
+        case "DumpRoutesGeneratedIds": target.setDumpRoutesGeneratedIds(property(camelContext, boolean.class, value)); return true;
         case "dumproutesinclude":
         case "DumpRoutesInclude": target.setDumpRoutesInclude(property(camelContext, java.lang.String.class, value)); return true;
         case "dumprouteslog":
@@ -332,6 +334,8 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "DumpRoutes": return java.lang.String.class;
         case "dumproutesdirectory":
         case "DumpRoutesDirectory": return java.lang.String.class;
+        case "dumproutesgeneratedids":
+        case "DumpRoutesGeneratedIds": return boolean.class;
         case "dumproutesinclude":
         case "DumpRoutesInclude": return java.lang.String.class;
         case "dumprouteslog":
@@ -590,6 +594,8 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "DumpRoutes": return target.getDumpRoutes();
         case "dumproutesdirectory":
         case "DumpRoutesDirectory": return target.getDumpRoutesDirectory();
+        case "dumproutesgeneratedids":
+        case "DumpRoutesGeneratedIds": return target.isDumpRoutesGeneratedIds();
         case "dumproutesinclude":
         case "DumpRoutesInclude": return target.getDumpRoutesInclude();
         case "dumprouteslog":
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 6dd2a3c22de..e8028acc780 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
@@ -40,6 +40,7 @@
     { "name": "camel.main.devConsoleEnabled", "description": "Whether to enable developer console (requires camel-console on classpath). The developer console is only for assisting during development. This is NOT for production usage.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.dumpRoutes", "description": "If dumping is enabled then Camel will during startup dump all loaded routes (incl rests and route templates) represented as XML\/YAML DSL into the log. This is intended for trouble shooting or to assist during development. Sensitive information that may be configured in the route endpoints could potentially be included in the dump output and is therefore not recommended being used for production usage. This requires to have camel-xml [...]
     { "name": "camel.main.dumpRoutesDirectory", "description": "Whether to save route dumps to files in the given directory. The name of the files are based on original loaded resource, or an autogenerated name.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.main.dumpRoutesGeneratedIds", "description": "Whether to include auto generated IDs in the dumped output. Default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.dumpRoutesInclude", "description": "Controls what to include in output for route dumping. Possible values: all, routes, rests, routeConfigurations, routeTemplates, beans. Multiple values can be separated by comma. Default is routes.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "routes" },
     { "name": "camel.main.dumpRoutesLog", "description": "Whether to log route dumps to Logger", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.main.dumpRoutesResolvePlaceholders", "description": "Whether to resolve property placeholders in the dumped output. Default is true.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index b0c27393219..0614e98e98c 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -19,7 +19,7 @@ The following tables lists all the options:
 
 // main options: START
 === Camel Main configurations
-The camel.main supports 125 options, which are listed below.
+The camel.main supports 126 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -51,6 +51,7 @@ The camel.main supports 125 options, which are listed below.
 | *camel.main.devConsoleEnabled* | Whether to enable developer console (requires camel-console on classpath). The developer console is only for assisting during development. This is NOT for production usage. | false | boolean
 | *camel.main.dumpRoutes* | If dumping is enabled then Camel will during startup dump all loaded routes (incl rests and route templates) represented as XML/YAML DSL into the log. This is intended for trouble shooting or to assist during development. Sensitive information that may be configured in the route endpoints could potentially be included in the dump output and is therefore not recommended being used for production usage. This requires to have camel-xml-io/camel-yaml-io on the cla [...]
 | *camel.main.dumpRoutesDirectory* | Whether to save route dumps to files in the given directory. The name of the files are based on original loaded resource, or an autogenerated name. |  | String
+| *camel.main.dumpRoutesGenerated{zwsp}Ids* | Whether to include auto generated IDs in the dumped output. Default is false. | false | boolean
 | *camel.main.dumpRoutesInclude* | Controls what to include in output for route dumping. Possible values: all, routes, rests, routeConfigurations, routeTemplates, beans. Multiple values can be separated by comma. Default is routes. | routes | String
 | *camel.main.dumpRoutesLog* | Whether to log route dumps to Logger | true | boolean
 | *camel.main.dumpRoutesResolve{zwsp}Placeholders* | Whether to resolve property placeholders in the dumped output. Default is true. | true | boolean
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
index f55b933bc1a..1d6346c7625 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
@@ -264,6 +264,7 @@ public final class DefaultConfigurationConfigurer {
             drs.setInclude(config.getDumpRoutesInclude());
             drs.setLog(config.isDumpRoutesLog());
             drs.setUriAsParameters(config.isDumpRoutesUriAsParameters());
+            drs.setGeneratedIds(config.isDumpRoutesGeneratedIds());
             drs.setResolvePlaceholders(config.isDumpRoutesResolvePlaceholders());
             drs.setDirectory(config.getDumpRoutesDirectory());
         }
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
index 29a092a3935..6c028717251 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
@@ -135,6 +135,7 @@ public abstract class DefaultConfigurationProperties<T> {
     private boolean dumpRoutesLog = true;
     private boolean dumpRoutesResolvePlaceholders = true;
     private boolean dumpRoutesUriAsParameters;
+    private boolean dumpRoutesGeneratedIds;
     private String dumpRoutesDirectory;
     private Map<String, String> globalOptions;
     // route controller
@@ -1439,6 +1440,17 @@ public abstract class DefaultConfigurationProperties<T> {
         this.dumpRoutesUriAsParameters = dumpRoutesUriAsParameters;
     }
 
+    public boolean isDumpRoutesGeneratedIds() {
+        return dumpRoutesGeneratedIds;
+    }
+
+    /**
+     * Whether to include auto generated IDs in the dumped output. Default is false.
+     */
+    public void setDumpRoutesGeneratedIds(boolean dumpRoutesGeneratedIds) {
+        this.dumpRoutesGeneratedIds = dumpRoutesGeneratedIds;
+    }
+
     public String getDumpRoutesDirectory() {
         return dumpRoutesDirectory;
     }
@@ -2679,6 +2691,14 @@ public abstract class DefaultConfigurationProperties<T> {
         return (T) this;
     }
 
+    /**
+     * Whether to include auto generated IDs in the dumped output. Default is false.
+     */
+    public T withDumpRoutesGeneratedIds(boolean dumpRoutesGeneratedIds) {
+        this.dumpRoutesGeneratedIds = dumpRoutesGeneratedIds;
+        return (T) this;
+    }
+
     /**
      * Whether to save route dumps to files in the given directory. The name of the files are based on original loaded
      * resource, or an autogenerated name.
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java
index d7de3e7fb1c..e7ed34cf98d 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java
@@ -195,6 +195,9 @@ public interface ManagedCamelContextMBean extends ManagedPerformanceCounterMBean
     @ManagedOperation(description = "Dumps the routes as XML")
     String dumpRoutesAsXml(boolean resolvePlaceholders) throws Exception;
 
+    @ManagedOperation(description = "Dumps the routes as XML")
+    String dumpRoutesAsXml(boolean resolvePlaceholders, boolean generatedIds) throws Exception;
+
     @ManagedOperation(description = "Dumps the CamelContext and routes stats as XML")
     String dumpRoutesStatsAsXml(boolean fullStats, boolean includeProcessors) throws Exception;
 
@@ -216,6 +219,9 @@ public interface ManagedCamelContextMBean extends ManagedPerformanceCounterMBean
     @ManagedOperation(description = "Dumps the routes as YAML")
     String dumpRoutesAsYaml(boolean resolvePlaceholders, boolean uriAsParameters) throws Exception;
 
+    @ManagedOperation(description = "Dumps the routes as YAML")
+    String dumpRoutesAsYaml(boolean resolvePlaceholders, boolean uriAsParameters, boolean generatedIds) throws Exception;
+
     /**
      * Creates the endpoint by the given uri
      *
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
index 4f6e7dc2b8a..1ea2d61ca74 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
@@ -121,6 +121,9 @@ public interface ManagedRouteMBean extends ManagedPerformanceCounterMBean {
     @ManagedOperation(description = "Dumps the route as XML")
     String dumpRouteAsXml(boolean resolvePlaceholders) throws Exception;
 
+    @ManagedOperation(description = "Dumps the route as XML")
+    String dumpRouteAsXml(boolean resolvePlaceholders, boolean generatedIds) throws Exception;
+
     @ManagedOperation(description = "Dumps the route as YAML")
     String dumpRouteAsYaml() throws Exception;
 
@@ -130,6 +133,9 @@ public interface ManagedRouteMBean extends ManagedPerformanceCounterMBean {
     @ManagedOperation(description = "Dumps the route as YAML")
     String dumpRouteAsYaml(boolean resolvePlaceholders, boolean uriAsParameters) throws Exception;
 
+    @ManagedOperation(description = "Dumps the route as YAML")
+    String dumpRouteAsYaml(boolean resolvePlaceholders, boolean uriAsParameters, boolean generatedIds) throws Exception;
+
     @ManagedOperation(description = "Dumps the route stats as XML")
     String dumpRouteStatsAsXml(boolean fullStats, boolean includeProcessors) throws Exception;
 
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
index 382f54fa0c0..b709ad93c29 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
@@ -447,7 +447,6 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti
         try (ProducerTemplate template = context.createProducerTemplate()) {
             return template.requestBodyAndHeaders(endpointUri, body, headers);
         }
-
     }
 
     @Override
@@ -465,16 +464,21 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti
         RestsDefinition def = new RestsDefinition();
         def.setRests(rests);
 
-        return PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, resolvePlaceholders);
+        return PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, resolvePlaceholders, true);
     }
 
     @Override
     public String dumpRoutesAsXml() throws Exception {
-        return dumpRoutesAsXml(false);
+        return dumpRoutesAsXml(false, true);
     }
 
     @Override
     public String dumpRoutesAsXml(boolean resolvePlaceholders) throws Exception {
+        return dumpRoutesAsXml(resolvePlaceholders, true);
+    }
+
+    @Override
+    public String dumpRoutesAsXml(boolean resolvePlaceholders, boolean generatedIds) throws Exception {
         List<RouteDefinition> routes = context.getCamelContextExtension().getContextPlugin(Model.class).getRouteDefinitions();
         if (routes.isEmpty()) {
             return null;
@@ -484,7 +488,7 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti
         RoutesDefinition def = new RoutesDefinition();
         def.setRoutes(routes);
 
-        return PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, resolvePlaceholders);
+        return PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, resolvePlaceholders, generatedIds);
     }
 
     @Override
@@ -494,11 +498,17 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti
 
     @Override
     public String dumpRoutesAsYaml(boolean resolvePlaceholders) throws Exception {
-        return dumpRoutesAsYaml(resolvePlaceholders, false);
+        return dumpRoutesAsYaml(resolvePlaceholders, false, true);
     }
 
     @Override
     public String dumpRoutesAsYaml(boolean resolvePlaceholders, boolean uriAsParameters) throws Exception {
+        return dumpRoutesAsYaml(resolvePlaceholders, uriAsParameters, true);
+    }
+
+    @Override
+    public String dumpRoutesAsYaml(boolean resolvePlaceholders, boolean uriAsParameters, boolean generatedIds)
+            throws Exception {
         List<RouteDefinition> routes = context.getCamelContextExtension().getContextPlugin(Model.class).getRouteDefinitions();
         if (routes.isEmpty()) {
             return null;
@@ -508,7 +518,8 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti
         RoutesDefinition def = new RoutesDefinition();
         def.setRoutes(routes);
 
-        return PluginHelper.getModelToYAMLDumper(context).dumpModelAsYaml(context, def, resolvePlaceholders, uriAsParameters);
+        return PluginHelper.getModelToYAMLDumper(context).dumpModelAsYaml(context, def, resolvePlaceholders, uriAsParameters,
+                generatedIds);
     }
 
     @Override
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
index 7b8154c363e..0f7e00790e1 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
@@ -388,10 +388,15 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
 
     @Override
     public String dumpRouteAsXml(boolean resolvePlaceholders) throws Exception {
+        return dumpRouteAsXml(resolvePlaceholders, true);
+    }
+
+    @Override
+    public String dumpRouteAsXml(boolean resolvePlaceholders, boolean generatedIds) throws Exception {
         String id = route.getId();
         RouteDefinition def = context.getCamelContextExtension().getContextPlugin(Model.class).getRouteDefinition(id);
         if (def != null) {
-            return PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, resolvePlaceholders);
+            return PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, def, resolvePlaceholders, generatedIds);
         }
 
         return null;
@@ -404,16 +409,21 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
 
     @Override
     public String dumpRouteAsYaml(boolean resolvePlaceholders) throws Exception {
-        return dumpRouteAsYaml(resolvePlaceholders, false);
+        return dumpRouteAsYaml(resolvePlaceholders, false, true);
     }
 
     @Override
     public String dumpRouteAsYaml(boolean resolvePlaceholders, boolean uriAsParameters) throws Exception {
+        return dumpRouteAsYaml(resolvePlaceholders, uriAsParameters, true);
+    }
+
+    @Override
+    public String dumpRouteAsYaml(boolean resolvePlaceholders, boolean uriAsParameters, boolean generatedIds) throws Exception {
         String id = route.getId();
         RouteDefinition def = context.getCamelContextExtension().getContextPlugin(Model.class).getRouteDefinition(id);
         if (def != null) {
             return PluginHelper.getModelToYAMLDumper(context).dumpModelAsYaml(context, def, resolvePlaceholders,
-                    uriAsParameters);
+                    uriAsParameters, generatedIds);
         }
 
         return null;
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/LwModelToXMLDumper.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/LwModelToXMLDumper.java
index db76fe5ca41..91bb5d9fef4 100644
--- a/core/camel-xml-io/src/main/java/org/apache/camel/xml/LwModelToXMLDumper.java
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/LwModelToXMLDumper.java
@@ -58,12 +58,12 @@ public class LwModelToXMLDumper implements ModelToXMLDumper {
 
     @Override
     public String dumpModelAsXml(CamelContext context, NamedNode definition) throws Exception {
-        return dumpModelAsXml(context, definition, false);
+        return dumpModelAsXml(context, definition, false, true);
     }
 
     @Override
     public String dumpModelAsXml(
-            CamelContext context, NamedNode definition, boolean resolvePlaceholders)
+            CamelContext context, NamedNode definition, boolean resolvePlaceholders, boolean generatedIds)
             throws Exception {
 
         Properties properties = new Properties();
@@ -88,12 +88,11 @@ public class LwModelToXMLDumper implements ModelToXMLDumper {
             @Override
             protected void doWriteOptionalIdentifiedDefinitionAttributes(OptionalIdentifiedDefinition<?> def)
                     throws IOException {
-                // write customId if not false
-                if (Boolean.TRUE.equals(def.getCustomId())) {
-                    doWriteAttribute("customId", toString(def.getCustomId()));
+
+                if (generatedIds || Boolean.TRUE.equals(def.getCustomId())) {
+                    // write id
+                    doWriteAttribute("id", def.getId());
                 }
-                // write id
-                doWriteAttribute("id", def.getId());
                 // write description
                 if (def.getDescriptionText() != null) {
                     doWriteAttribute("description", def.getDescriptionText());
diff --git a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbModelToXMLDumper.java b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbModelToXMLDumper.java
index 266162386b4..0d4ca70f8c7 100644
--- a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbModelToXMLDumper.java
+++ b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbModelToXMLDumper.java
@@ -74,6 +74,10 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper {
 
     @Override
     public String dumpModelAsXml(CamelContext context, NamedNode definition) throws Exception {
+        return doDumpModelAsXml(context, definition, true);
+    }
+
+    public String doDumpModelAsXml(CamelContext context, NamedNode definition, boolean generatedIds) throws Exception {
         final JAXBContext jaxbContext = getJAXBContext(context);
         final Map<String, String> namespaces = new LinkedHashMap<>();
         final Map<String, KeyValueHolder<Integer, String>> locations = new HashMap<>();
@@ -129,10 +133,10 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper {
             throw new TypeConversionException(xml, Document.class, e);
         }
 
-        sanitizeXml(dom);
         if (context.isDebugging()) {
             enrichLocations(dom, locations);
         }
+        sanitizeXml(dom, generatedIds);
 
         // Add additional namespaces to the document root element
         Element documentElement = dom.getDocumentElement();
@@ -156,7 +160,7 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper {
 
     @Override
     public String dumpModelAsXml(
-            CamelContext context, NamedNode definition, boolean resolvePlaceholders)
+            CamelContext context, NamedNode definition, boolean resolvePlaceholders, boolean generatedIds)
             throws Exception {
         String xml = dumpModelAsXml(context, definition);
 
@@ -208,11 +212,10 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper {
             // okay there were some property placeholder or delegate endpoints
             // replaced so re-create the model
             if (changed.get()) {
-                // remove all generated ID from dom, as we do not want to copy those over
                 removeAutoAssignedIds(dom.getDocumentElement());
                 xml = context.getTypeConverter().mandatoryConvertTo(String.class, dom);
                 NamedNode copy = modelToXml(context, xml, NamedNode.class);
-                xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, copy);
+                xml = PluginHelper.getModelToXMLDumper(context).dumpModelAsXml(context, copy, false, generatedIds);
             }
         }
 
@@ -241,18 +244,26 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper {
         return buffer.toString();
     }
 
-    private static void sanitizeXml(Node node) {
+    private static void sanitizeXml(Node node, boolean generatedIds) {
         // we want to remove all customId="false" attributes as they are noisy
         if (node.hasAttributes()) {
             Node att = node.getAttributes().getNamedItem("customId");
-            if (att != null && "false".equals(att.getNodeValue())) {
+            boolean custom = att != null && "true".equals(att.getNodeValue());
+            if (att != null) {
                 node.getAttributes().removeNamedItem("customId");
             }
+            if (!generatedIds && !custom) {
+                // remove auto-generated ids
+                Node attId = node.getAttributes().getNamedItem("id");
+                if (attId != null) {
+                    node.getAttributes().removeNamedItem("id");
+                }
+            }
         }
         if (node.hasChildNodes()) {
             for (int i = 0; i < node.getChildNodes().getLength(); i++) {
                 Node child = node.getChildNodes().item(i);
-                sanitizeXml(child);
+                sanitizeXml(child, generatedIds);
             }
         }
     }
diff --git a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/LwModelToYAMLDumper.java b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/LwModelToYAMLDumper.java
index 72e52a6f93b..c3081ca2d68 100644
--- a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/LwModelToYAMLDumper.java
+++ b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/LwModelToYAMLDumper.java
@@ -58,13 +58,13 @@ public class LwModelToYAMLDumper implements ModelToYAMLDumper {
 
     @Override
     public String dumpModelAsYaml(CamelContext context, NamedNode definition) throws Exception {
-        return dumpModelAsYaml(context, definition, false, false);
+        return dumpModelAsYaml(context, definition, false, false, true);
     }
 
     @Override
     public String dumpModelAsYaml(
             CamelContext context, NamedNode definition, boolean resolvePlaceholders,
-            boolean uriAsParameters)
+            boolean uriAsParameters, boolean generatedIds)
             throws Exception {
         Properties properties = new Properties();
         Map<String, String> namespaces = new LinkedHashMap<>();
@@ -88,12 +88,11 @@ public class LwModelToYAMLDumper implements ModelToYAMLDumper {
             @Override
             protected void doWriteOptionalIdentifiedDefinitionAttributes(OptionalIdentifiedDefinition<?> def)
                     throws IOException {
-                // write customId if not false
-                if (Boolean.TRUE.equals(def.getCustomId())) {
-                    doWriteAttribute("customId", toString(def.getCustomId()));
+
+                if (generatedIds || Boolean.TRUE.equals(def.getCustomId())) {
+                    // write id
+                    doWriteAttribute("id", def.getId());
                 }
-                // write id
-                doWriteAttribute("id", def.getId());
                 // write location information
                 if (context.isDebugging()) {
                     String loc = (def instanceof RouteDefinition ? ((RouteDefinition) def).getInput() : def).getLocation();